在WCF中传递此类集合是否有任何问题?
class Parent
{
[DataMember]
// some data members
[DataMember]
Child myChild;
}
class Child : Parent
{
[DataMember]
// some more data members
[DataMember]
Parent myParent;
}
如果在传递Parent
列表时遇到任何问题吗?
我得到了奇怪的结果,有时是通道故障,有时候它没有故障,但在我从列表中删除所有孩子之前没有给我任何数据。
答案 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;
}