一千萬個為什麽

搜索

使用DataContractSerializer序列化子類實例的實用方法是什麽?

使用DataContractSerializer序列化子類實例的實用方法是什麽?

例如,以下是數據類型:

 [DataContract]
    public class Car
    {
        public Car()
        {
            Wheels = new Collection();
        }

        [DataMember]
        public Collection Wheels { get; set; }
    }

    [DataContract]    
    public abstract class Wheel
    {
        [DataMember]
        public string Name { get; set; }
    }

    [DataContract]
    public class MichelinWheel : Wheel
    {
        [DataMember]
        public string Wheel1Test { get; set; }
    }

    [DataContract]
    public class BridgeStoneWheel : Wheel
    {
        [DataMember]
        public string Wheel2Test { get; set; }
    }

然後這裏是創建一個有兩個不同輪子的汽車的代碼:

    Car car = new Car();

    MichelinWheel w1 = new MichelinWheel { Name = "o1", Wheel1Test = "o1 test" };
    BridgeStoneWheel w2 = new BridgeStoneWheel { Name = "o2", Wheel2Test = "o2 test" };

    car.Wheels.Add(w1);
    car.Wheels.Add(w2);

現在,如果我嘗試使用DataContractSerializer來序列化汽車,我將得到一個例外,表示不期望MichelinWheel。我必須像這樣修改Wheel類以使其工作:

 [DataContract]
    [KnownType(typeof(MichelinWheel))]
    [KnownType(typeof(BridgeStoneWheel))]
    public abstract class Wheel
    {
        [DataMember]
        public string Name { get; set; }
    }

但這種方法並不實用,因為我無法在創建之前列出所有類型的輪子。每次創建一個新品牌的輪子後更改Wheel類也是不切實際的,因為它們可能是通過第三方代碼創建的。

那麽,在使用DataContractSerializer時序列化子類實例的實用方法是什麽?

謝謝

最佳答案

使用WCF 4中的 DataContractResolver 檢查本文您還可以將 KnownTypeAttribute傳遞方法的名稱,它將使用反射來獲取所有類型。無論如何,服務要求所有類型在開始之前都是已知的。

轉載註明原文: 使用DataContractSerializer序列化子類實例的實用方法是什麽?