2010-09-02 127 views
2

我想通過WCF方法傳遞一組相當通用的數據。數據基本上只是一個關鍵/值對的分層集合,但它嵌套到任意級別。我最初考慮將它作爲單個字符串傳遞,並在任何一端進行XML或JSON或類似的編碼/解碼,但由於WCF傳輸是XML,所以看起來有點傻,所以我希望有一種方法可以傳遞它「自然」。通過WCF傳遞遞歸集合

的方法是相當簡單:

[OperationContract] 
void ProcessData(DataTree tree); 

有:

public class DataTree : Dictionary<string, DataTree> 
{ 
} 

這一切編譯罰款,但是當我嘗試運行它與DataContract.GetStableName下StackOverflowException崩潰的服務。

我試着在DataTree類中放上一個[CollectionDataContract]屬性,並明確指定了所有的名字,但這似乎沒有任何區別。

我也試過把[DataContract]放在它上面,但是之後它失敗的更早,因爲DictionaryISerializable

任何想法?有一個更好的方法嗎?

回答

1

事實證明,出現了另一個要求(除了一列兒童以外,還指定了一個簡單的節點值),所以我最終爲它定義了一個子類型,這似乎讓WCF滿意它:

[CollectionDataContract(IsReference = true, ItemName = "Param", 
         KeyName = "Name", ValueName = "Data")] 
public class DataTree : Dictionary<string, DataTreeEntry> 
{ 
} 

[DataContract] 
public class DataTreeEntry 
{ 
    [DataMember] 
    public string Value { get; set; } 

    [DataMember] 
    public DataTree Children { get; set; } 
} 
1

對於過去的大型對象樹,我已經將數據自己序列化爲一個通過WCF發送的字節數組(如果兩端都有WCF,WCF不一定是SOAP/XML),然後在接收端手動反序列化它。

基本上爲所討論的類創建一個Serialize(BinaryWriter writer)和,它將自己序列化,並將寫入器/讀取器傳遞給子對象進行遞歸序列化。

你也可以看看使用protobuf-net進行序列化/反序列化。既可以作爲WCF調用的傳輸,也可以手動傳輸,並通過線路傳遞字節數組。

+0

謝謝,但這仍然是我試圖避免的方法。如果我找不到任何其他方式讓WCF發揮作用,我可能不得不採用它,但我更願意「本地」處理它。 – Miral 2010-09-02 20:08:55

+0

@Miral:我明白,但根據我的經驗,大型對象樹序列化速度也很慢(但速度可能並不重要)。但你應該嘗試protobuf網。這是一個爲您的端點添加屬性的問題,指定將其用作序列化程序。 – 2010-09-03 06:18:52