数据契约和继承

本文关键字:继承 契约 数据 | 更新日期: 2023-09-27 18:18:18

如何使用继承数据合约?下面的代码可以工作吗?

[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类注册为ConsoleData的已知类型。

[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; }
}