2010-09-02 76 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