代码之家  ›  专栏  ›  技术社区  ›  Miral

通过WCF传递递归集合

  •  2
  • Miral  · 技术社区  · 14 年前

    方法相当简单:

    [OperationContract]
    void ProcessData(DataTree tree);
    

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

    我试着把 [CollectionDataContract] 属性 DataTree 类并显式指定所有名称,但这似乎没有任何区别。

    我也试过把 [DataContract] Dictionary ISerializable

    有什么想法吗?有没有更好的办法?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Mikael Svenson    14 年前

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

    基本上创建一个 Serialize(BinaryWriter writer) DeSerialize(BinaryReader reader) 对于正在讨论的类,它将自己序列化,并将writer/reader传递给子对象以进行递归序列化。

    protobuf-net 用于序列化/反序列化。作为WCF调用上的传输,或者手动,并通过线路传递字节数组。

        2
  •  1
  •   Miral    14 年前

    结果,出现了另一个需求(除了子节点列表外,还为节点指定了一个简单的值),因此我最终还是为它定义了一个子类型,这似乎让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; }
    }
    
    推荐文章