C# 数据契约和继承?
如何将DataContract与继承一起使用?下面的代码可以工作吗C# 数据契约和继承?,c#,wcf,C#,Wcf,如何将DataContract与继承一起使用?下面的代码可以工作吗 [DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; }
[DataContract]
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; }
}
是的,那会有用的
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; }
......
对您打算如何处理这两个数据契约?没有
KnownType
,什么将不起作用?我已经尝试了我在描述中写的代码,它似乎可以解决这个问题。将KnownType(typeof(SomeData))放在基类(ConsoleData)上是有意义的,它允许您将子实例传递给需要基实例的方法。但是我认为您不需要将它放在子实例上。@javapowered:如果您决定不使用KnownType属性,请小心,因为在某些特殊情况下需要它。一个这样的例子是,如果您要将某些数据作为另一个DataContract的属性公开。@AndrewShepherd:在我几周前对它所做的测试中,属性是放在父级还是子级上似乎并不重要(它以任何方式工作)。@M.Babcock-很抱歉在这里纠缠:在我尝试的情况下,您不需要KnownType属性。您能否提供一个实际需要KnownType属性的示例用法?(一段没有属性就无法工作的代码)@Andrew。我和这些问题斗争了很长时间。是否有可能在[OperationContract]中处理数据(基本数据)编码>并从SoapUI发送一些从Base
驱动的对象?然后,如果c#知道在base
上它是某个子类的hold实例,因此它也调用了适当的方法(多态性等),那么[KnownType(typeof(SomeData))]中有一个小的语法错误,谢谢你的帮助。@Shanjee谢谢,我添加了额外的括号。花了七年时间才有人注意到:——)