2

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

该方法相当简单:

[OperationContract]
void ProcessData(DataTree tree);

和:

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

这一切都编译得很好,但是当我尝试运行该服务时,它在 DataContract.GetStableName 下因 StackOverflowException 而崩溃。

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

我也尝试过[DataContract]在它上面放一个,但是它甚至更早地失败了,因为Dictionaryis ISerializable

有任何想法吗?有一个更好的方法吗?

4

2 回答 2

1

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

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

您还可以考虑使用protobuf-net进行序列化/反序列化。可以作为 WCF 调用上的传输,也可以手动传输,并通过网络传递一个字节数组。

于 2010-09-02T10:04:16.410 回答
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; }
}
于 2010-09-06T00:29:39.313 回答