如何将DataContract与继承一起使用?下面的代码可以工作吗?
[DataContract]
public class ConsoleData
{
[DataMember]
public String Description { get; set; }
}
[DataContract]
public class SomeData : ConsoleData
{
[DataMember]
public int Volume { get; set; }
......发布于 2011-12-19 06:12:26
是的,那是可行的。
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; }
......发布于 2011-12-19 05:54:10
如果将XmlSerializerFormat用于ServiceContract,则需要使用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; }
}https://stackoverflow.com/questions/8555089
复制相似问题