c# - DataContract 和继承?

标签 c# wcf

如何使用继承的DataContract?下面的代码可以工作吗?

[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 类注册为 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; }
    ......

关于c# - DataContract 和继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555089/

相关文章:

c# - DataReader::Dispose 应该调用 DataReader::Close 吗?

c# - 如何将歌曲的持续时间格式化为分钟和秒?

.net - WCF Web 服务和 native ASP.NET 健康监控

.net - MVC 是 RESTful 设计的吗

.net - 使用真实IP加密发送到托管在服务器上的WCF服务的消息

c# - EF6 一对多流畅映射

c# - 如何使用 ViewModel 中的 bool 属性启用/禁用附加行为

c# - 如何使用查询语法来创建排列?

wcf - 在 WCF 客户端上调用多个操作

WCF:我需要用动态命名空间替换 "http://tempuri.org/"吗?