我想通过WCF方法传递一组相当通用的数据。数据基本上只是一组键/值对的层次结构,但它嵌套在任意级别。我最初考虑将其作为单个字符串传递,并在两端执行XML或JSON或类似的编码/解码,但由于WCF传输是XML,无论如何看起来有点傻,所以我希望有一种方法可以通过它“自然地”。
该方法相当简单:
[OperationContract]
void ProcessData(DataTree tree);
使用:
public class DataTree : Dictionary<string, DataTree>
{
}
这一切都很好,但是当我尝试运行服务时,它会在DataContract.GetStableName下崩溃并发生StackOverflowException。
我尝试在[CollectionDataContract]
类上添加DataTree
属性并明确指定所有名称,但这似乎没有任何区别。
我还尝试在其上添加[DataContract]
,但由于Dictionary
为ISerializable
,因此它甚至更早失败。
有什么想法吗?有更好的方法吗?
答案 0 :(得分:1)
对于过去的大型对象树,我自己将数据序列化为一个字节数组,该数组通过WCF发送(如果两端都有WCF,则WCF不必是SOAP / XML),然后反序列化它在接收端手动。
基本上为有问题的类创建一个Serialize(BinaryWriter writer)
和DeSerialize(BinaryReader reader)
来自行序列化,并将编写器/阅读器向下传递给子对象以进行递归序列化。
您还可以考虑使用protobuf-net进行序列化/反序列化。无论是作为WCF调用的传输,还是手动传输,并通过线路传递字节数组。
答案 1 :(得分: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; }
}