DataContract和inheritance?

如何使用DataContractinheritance? 代码如下工作?

[DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } ...... 

是的,那会有用。

DataContractAttributeInherited设置为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; } }