通过WCF传递递归收集

时间:2010-09-02 08:50:19

标签: c# wcf .net-3.5 dictionary iserializable

我想通过WCF方法传递一组相当通用的数据。数据基本上只是一组键/值对的层次结构,但它嵌套在任意级别。我最初考虑将其作为单个字符串传递,并在两端执行XML或JSON或类似的编码/解码,但由于WCF传输是XML,无论如何看起来有点傻,所以我希望有一种方法可以通过它“自然地”。

该方法相当简单:

[OperationContract]
void ProcessData(DataTree tree);

使用:

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

这一切都很好,但是当我尝试运行服务时,它会在DataContract.GetStableName下崩溃并发生StackOverflowException。

我尝试在[CollectionDataContract]类上添加DataTree属性并明确指定所有名称,但这似乎没有任何区别。

我还尝试在其上添加[DataContract],但由于DictionaryISerializable,因此它甚至更早失败。

有什么想法吗?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

对于过去的大型对象树,我自己将数据序列化为一个字节数组,该数组通过WCF发送(如果两端都有WCF,则WCF不必是SOAP / XML),然后反序列化它在接收端手动。

基本上为有问题的类创建一个Serialize(BinaryWriter writer)DeSerialize(BinaryReader reader)来自行序列化,并将编写器/阅读器向下传递给子对象以进行递归序列化。

您还可以考虑使用protobuf-net进行序列化/反序列化。无论是作为WCF调用的传输,还是手动传输,并通过线路传递字节数组。

答案 1 :(得分: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; }
}