首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过WCF传递递归集合

通过WCF传递递归集合
EN

Stack Overflow用户
提问于 2010-09-02 16:50:19
回答 2查看 2K关注 0票数 2

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

该方法相当简单:

代码语言:javascript
复制
[OperationContract]
void ProcessData(DataTree tree);

通过以下方式:

代码语言:javascript
复制
public class DataTree : Dictionary<string, DataTree>
{
}

这一切都编译得很好,但当我尝试运行该服务时,它在DataContract.GetStableName下崩溃了,并显示了一个StackOverflowException。

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

我也尝试过在它上面放置一个[DataContract],但是由于DictionaryISerializable,所以它甚至失败了。

有什么想法吗?有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-06 08:29:39

结果,出现了另一个要求(除了子节点列表之外,还为节点指定了一个简单的值),所以我最终还是为它定义了一个子节点类型,这似乎让WCF对它很满意:

代码语言:javascript
复制
[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
EN

Stack Overflow用户

发布于 2010-09-02 18:04:16

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3625504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档