我想要通过WCF方法传递一个相当通用的数据集。数据基本上是一个分层组键/值对的,但它的嵌套到任意级别。我本来认为它传递虽然作为一个字符串,做XML或JSON或类似的编码/任一端解码,但是由于WCF运输是愚蠢似乎有点,所以我希望有一种方法,通过它传递XML反正“自然地”。

的方法是非常简单的:

[OperationContract]
void ProcessData(DataTree tree);

使用:

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

这一切编译罚款,但是当我尝试运行它与DataContract.GetStableName下StackOverflowException崩溃的服务。

我试过把对[CollectionDataContract]DataTree属性,明确指定所有的名字,但是这似乎并没有任何区别。

我也试过把一个[DataContract]就可以了,但随后失败,甚至更早,因为DictionaryISerializable

任何想法?有没有更好的方式来做到这一点?

有帮助吗?

解决方案 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呼叫,或者手动,并通过一个字节数组通过线路传输。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top