2009-10-04 147 views
1

在WCF中传递这种集合是否存在任何问题?WCF传递多种类型的集合

class Parent 
{ 
    [DataMember] 
    // some data members 

    [DataMember] 
    Child myChild;  
} 

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

    [DataMember] 
    Parent myParent; 
} 

是否有任何问题通过Parent列表?

我得到了奇怪的结果,有时是通道故障,有时它并没有错,但直到我从列表中删除所有的孩子才给我没有数据。

+0

更新了我与CollectionDataContract答案 - 检查出来 – 2009-10-04 13:54:57

回答

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

马克

+0

看来你是正确的..但,尽管我已经添加了所有正确的属性,但我仍然会遇到一些奇怪的行为。 我认为它涉及的对象是由NHibernate创建的,也许问题在那里... – Dani 2009-10-04 12:22:38

+0

丹妮,现在你提到,你使用NHibernate 据我记得它使用受保护的setters类,我对吗? 虽然WCF要求所有标记有DataContract属性的属性都有公共getter和setter – 2009-10-04 15:00:28

+1

嗨,WCF与NH属性很好, 虽然仍在调查,但我发现问题是我使用了标准typeof(父)得到的对象,和NH返回所有的父亲和儿子(如预期的...)和WCF无法处理它 - B/C它预计只有父类型的对象(尽管包含内部的子对象不是一个问题 - 有 现在,我正在检查是否可以更改查询以获取“父”对象,并且它应该可以解决问题,我希望。 – Dani 2009-10-05 10:14:24

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; 
} 
+0

尝试了它,并且还杀死了继承,但它仍然不起作用 (现在父亲只有一个IList它是孩子,但子对象不继承父亲 (它们都继承了一些基类) – Dani 2009-10-04 13:33:12

+0

通过WCF工作的通用对象集合请阅读:http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html – 2009-10-04 15:07:10