2009-10-04 53 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