【问题标题】:Passing recursive collection through WCF通过 WCF 传递递归集合
【发布时间】:2010-09-02 08:50:19
【问题描述】:

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

方法相当简单:

[OperationContract]
void ProcessData(DataTree tree);

与:

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

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

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

我也试过在上面加上[DataContract],但它甚至更早失败了,因为DictionaryISerializable

有什么想法吗?有没有更好的方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但这仍然是我试图避免的方法。如果我找不到任何其他方法让 WCF 正常运行,我可能不得不求助于它,但我真的更喜欢“本地”处理它。
    • @Miral:我理解,但根据我的经验,大型对象树的序列化速度也很慢(但速度可能并不重要)。但是你应该试试 protobuf-net。只需向端点添加一个属性,指定将其用作序列化程序。
    【解决方案2】:

    事实证明,出现了另一个要求(除了子列表之外,还为节点指定一个简单的值),所以我最终还是为它定义了一个子类型,这似乎让 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多