DataContract和继承?

jav*_*red 30 c# wcf

如何使用DataContract继承?代码如下工作?

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......
Run Code Online (Sandbox Code Playgroud)

And*_*erd 45

是的,那会有用.

在DataContractAttribute已Inherited设置为false,所以需要将属性应用到子类和父类两种(如你的问题做了).


KnownType如果要使用具有多态性的数据协定,则 需要使用该属性.

例如

 [ServiceContract]
 interface MyWcfContract
 {
       [OperationContract]
       HandleData(ConsoleData contractData);
 }
Run Code Online (Sandbox Code Playgroud)

如果您调用这样的方法:

 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);
Run Code Online (Sandbox Code Playgroud)

然后服务端的反序列化器将不知道它是一个实例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; }
    ......
Run Code Online (Sandbox Code Playgroud)