【问题标题】:DataContract and inheritance?数据契约和继承?
【发布时间】:2011-12-18 21:50:21
【问题描述】:

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

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

}

[DataContract]
public class SomeData : ConsoleData
{

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

【问题讨论】:

  • 是的。你想用这两个数据合约做什么?

标签: c# wcf


【解决方案1】:

是的,那会起作用。

DataContractAttributeInherited 设置为 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; }
    ......

【讨论】:

  • @Andrew。我与这些主题斗争了很长时间。是否可以在 [OperationContract] HandleData(Base base); 中包含并从 SoapUI 发送来自 Base 的一些驱动对象?然后,如果 c# 会意识到在 base 上它是某个子类的实例 - 所以它也会调用正确的方法(多态性等)
  • [KnownType(typeof(SomeData))] 中有一个小语法错误,感谢您的帮助。
  • @Shanjee 谢谢,我添加了额外的括号。有人花了七年的时间才注意到:-)
【解决方案2】:

如果您为 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; }
}

【讨论】:

  • 如果没有KnownType,什么是行不通的?我已经尝试了我在描述中写的代码,它似乎可以工作
  • 我对此表示怀疑。将 KnownType(typeof(SomeData)) 放在基类 (ConsoleData) 上是有意义的,允许您将子实例传递给期望基实例的方法。但我认为您不需要将其放在子实例上。
  • @javapowered:如果您决定不使用 KnownType 属性,请小心,因为在特殊情况下需要它。一个这样的例子是,如果您要将 SomeData 作为另一个 DataContract 的属性公开。
  • @AndrewShepherd:在我几周前对其进行的测试中,属性是放在父母身上还是孩子身上似乎并不重要(无论哪种方式都有效)。
  • @M.Babcock - 抱歉在这里纠缠不清:在我尝试的情况下,您不需要 KnownType 属性。您能否提供一个实际需要 KnownType 属性的示例用法? (即一段没有属性就无法工作的代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多