首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContract和继承?

DataContract和继承?
EN

Stack Overflow用户
提问于 2011-12-19 05:50:22
回答 2查看 22.9K关注 0票数 32

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

代码语言:javascript
复制
[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 06:12:26

是的,那是可行的。

DataContractAttributeInherited设置为false,因此有必要将该属性同时应用于子类和父类(正如您在问题中所做的那样)。

如果希望将数据契约与多态性一起使用,则需要使用KnownType属性。

例如

代码语言:javascript
复制
 [ServiceContract]
 interface MyWcfContract
 {
       [OperationContract]
       HandleData(ConsoleData contractData);
 }

如果您像这样调用该方法:

代码语言:javascript
复制
 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

代码语言:javascript
复制
[DataContract]
[KnownType(typeof(SomeData))]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......
票数 48
EN

Stack Overflow用户

发布于 2011-12-19 05:54:10

如果将XmlSerializerFormat用于ServiceContract,则需要使用KnownType属性:

代码语言:javascript
复制
[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }
}

[DataContract, KnownType(typeof(ConsoleData))]
public class SomeData : ConsoleData
{
    [DataMember]
    public int Volume { get; set; }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8555089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档