DataContract和inheritance?
如何使用DataContractinheritance? 代码如下工作?
[DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } ......
是的,那会有用。
DataContractAttribute
将Inherited
设置为false,因此必须将该属性应用于子类和父类(正如您在问题中所做的那样)。
如果要使用具有多态性的数据协定,则需要使用KnownType
属性。
例如
[ServiceContract] interface MyWcfContract { [OperationContract] HandleData(ConsoleData contractData); }
如果你调用这样的方法:
SomeData someData = new SomeData { Description = "Test", Volume = 30 }; // The method is expecting a ConsoleData instance, // I'm passing a SomeData instance instead myWcfProxy.HandleData(someData);
然后服务端的反序列化器将不知道它是SomeData
的实例,只是它期望的ConsoleData
实例。 解决这个问题的方法是将SomeData
类注册为SomeData
的已知类型。
[DataContract] [KnownType(typeof(SomeData))] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } ......
如果您正在为ServiceContract使用XmlSerializerFormat,则需要使用KnownType属性:
[DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract, KnownType(typeof(ConsoleData))] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } }