我想通过WCF方法传递一个相当通用的数据集。数据基本上只是一组分层的键/值对,但它是嵌套到任意级别的。我最初考虑将其作为单个字符串传递,并在两端执行XML或JSON或类似的编码/解码,但由于WCF传输无论如何都是XML,这看起来有点愚蠢,所以我希望有一种方法可以“自然”地传递它。
该方法相当简单:
[OperationContract]
void ProcessData(DataTree tree);通过以下方式:
public class DataTree : Dictionary<string, DataTree>
{
}这一切都编译得很好,但当我尝试运行该服务时,它在DataContract.GetStableName下崩溃了,并显示了一个StackOverflowException。
我尝试在DataTree类上添加一个[CollectionDataContract]属性并显式指定所有名称,但这似乎没有任何区别。
我也尝试过在它上面放置一个[DataContract],但是由于Dictionary是ISerializable,所以它甚至失败了。
有什么想法吗?有没有更好的方法来做这件事?
发布于 2010-09-06 08:29:39
结果,出现了另一个要求(除了子节点列表之外,还为节点指定了一个简单的值),所以我最终还是为它定义了一个子节点类型,这似乎让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; }
}发布于 2010-09-02 18:04:16
对于过去的大型对象树,我自己已经将数据序列化为一个字节数组,该数组通过WCF发送(如果两端都有WCF,则WCF不必是SOAP/XML ),然后在接收端手动反序列化它。
基本上,为相关的类创建一个Serialize(BinaryWriter writer)和DeSerialize(BinaryReader reader)来序列化自己,并将写入器/读取器向下传递给子对象以进行递归序列化。
您还可以考虑使用protobuf-net进行序列化/反序列化。或者作为WCF调用上的传输,或者手动,并通过网络传递一个字节数组。
https://stackoverflow.com/questions/3625504
复制相似问题