WCF传递多种类型的集合

时间:2009-10-04 08:53:36

标签: wcf

在WCF中传递此类集合是否有任何问题?

class Parent
{
  [DataMember]
  // some data members

  [DataMember]
  Child myChild;    
}

class Child : Parent
{
  [DataMember]     
  // some more data members

  [DataMember]
  Parent myParent;
}

如果在传递Parent列表时遇到任何问题吗?

我得到了奇怪的结果,有时是通道故障,有时候它没有故障,但在我从列表中删除所有孩子之前没有给我任何数据。

2 个答案:

答案 0 :(得分:1)

首先,您需要将[DataContract]放在要由WCF序列化和反序列化的每个类上 - 它是自动继承!

[DataContract]
class Parent
{
   .....
}

[DataContract]
class Child : Parent
{
   .....
}

如果您正在处理收藏品,那么您可能需要查看CollectionDataContract

[CollectionDataContract]
[KnownType(typeof(Parent))]
[KnownType(typeof(Child))]
public class CustomCollection : List<Parent>
{
}

此外,WCF和SOA通常与OOP有很大的不同,并且不能很好地处理继承。您很可能必须在您要使用的地方将[ServiceKnownTypes][KnownType]属性放在服务合同上并支持多态。

因此,如果您的服务方法接受Parent,但也应该能够接受Child实例,那么您需要使用[KnownType]修饰方法属性以使此信息可供WCF使用。

请参阅KnownType属性上的MSDN Documentation,或查看有关该主题的其他SO question

马克

答案 1 :(得分:0)

我建议将IsReference和KnownType添加到您的类中,如下所示:

[DataContract(IsReference = true)]
[KnownType(typeof(Child))]
class Parent
{
  [DataMember]
  some data members

  [DataMember]
  Child myChild;
}

[DataContract(IsReference = true)]
class Child : Parent
{
  [DataMember]
  some more data members

  [DataMember]
  Parent myParent;
}