通过WCF传递递归集合
-
26-09-2019 - |
题
我想要通过WCF方法传递一个相当通用的数据集。数据基本上是一个分层组键/值对的,但它的嵌套到任意级别。我本来认为它传递虽然作为一个字符串,做XML或JSON或类似的编码/任一端解码,但是由于WCF运输是愚蠢似乎有点,所以我希望有一种方法,通过它传递XML反正“自然地”。
的方法是非常简单的:
[OperationContract]
void ProcessData(DataTree tree);
使用:
public class DataTree : Dictionary<string, DataTree>
{
}
这一切编译罚款,但是当我尝试运行它与DataContract.GetStableName下StackOverflowException崩溃的服务。
我试过把对[CollectionDataContract]
类DataTree
属性,明确指定所有的名字,但是这似乎并没有任何区别。
我也试过把一个[DataContract]
就可以了,但随后失败,甚至更早,因为Dictionary
是ISerializable
。
任何想法?有没有更好的方式来做到这一点?
解决方案 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; }
}
其他提示
有关在大对象树过去我自己序列化的数据被发往超过与WCF字节数组(和WCF不必是SOAP / XML,如果你在两端具有WCF),然后反序列化它手动在接收端。
基本上创建用于所讨论其本身串行化的类一个Serialize(BinaryWriter writer)
和DeSerialize(BinaryReader reader)
,并将写入器/读取器下降到递归序列的子对象。
您也可以考虑使用 protobuf网序列化/反序列化。无论是作为在您的WCF呼叫,或者手动,并通过一个字节数组通过线路传输。
不隶属于 StackOverflow