【问题标题】:How to serialize Dictionary<string, string> through WCF?如何通过 WCF 序列化 Dictionary<string, string>?
【发布时间】:2010-12-03 08:52:31
【问题描述】:

我有一个数据成员类型为 Dictionary&lt;string, string&gt; 的数据合同。

生成的 Web 服务引用将其公开为类型为 ArrayOfKeyValueOfstringstringKeyValueOfstringstring[] 的成员。

有人见过吗?

【问题讨论】:

标签: wcf serialization


【解决方案1】:

WCF 仅序列化 结构,因为最终连接到网络上的内容必须是自包含的,足以对 任何 客户端有用,而不仅仅是 .NET 客户端。

在不同平台上开发的某些客户端可能不共享“字典”的概念,因此将字典序列化为携带有关底层类的隐式知识的表示会过于受限。

客户端甚至可能不是面向对象的。

字典不仅仅是结构 - 它还包含行为(例如,当您分配给已经存在的键时,您会覆盖该键等)并且该行为不能通过网络传播。

换句话说,字典和许多其他 .NET 类型不可互操作,因此 WCF 不会尝试将它们保存在 ServiceContract 中。

您最好为您的数据设计一个自定义DataContract

【讨论】:

  • 这并不意味着无法生成客户端代理将数据转换回字典。那么 Visual Studio 的“配置服务引用”对话框的“字典集合类型”选项设置为 System.Collections.Generic.Dictionary 时有什么作用?
【解决方案2】:

由于 WCF 必须将所有内容都转换为 XML,因此它必须适合 XML...集合通常转换为数组。

字典很难用 xml 表示,这就是为什么你在另一边有这种类型。您可以指定 SvcUtil.exe 在生成的代理代码中使用特定集合而不是数组,但我不确定它是否适用于字典。我会说你应该避免在这里使用字典,并使用更简单的集合。

我要做的是创建自己的数据类型,[DataContract],让它有两个字符串类型的字段,然后将这些字段组成一个集合,用你在字典中找到的所有内容进行填充。然后通过电汇发送该集合,然后将其转换回另一端的字典。

【讨论】:

  • 不就是de dah的序列吗?
  • @Kenny:不,标准的 DataContractSerializer 不支持 XML 节点上的属性(出于性能原因)
  • @kenny:坦率地说。是的。并且有很多人使用非常自然的键和值 xml 元素编写可序列化的字典。字典只是对的列表。唯一有效的论点是 Mark Seemann 关于行为的论点。但是字典肯定不难用 xml 来表示。 python也可以很好地序列化字典,使用与代码本身相同的表示!只需执行str(mydict) 即可获得它。
【解决方案3】:

有办法做到这一点。操作合约实际上是一个字符串。我转义了 json 字符串以将其保留为字符串。然后我在 web 方法中取消转义字符串并使用 NewtonSoftJson 将其解析为字典希望这有用...

我使用了 NewtonSoft Json 库...

c#代码

using Newtonsoft.Json;
[OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    public void testMethod(string jsonData)
    {
        string data = Uri.UnescapeDataString(jsonData);
        Dictionary<string, string> x = jsonConvert.DeserializeObject<Dictionary<string, string>>(data);
        foreach (KeyValuePair<string, string> kvp in x)
        {

        }
    }

JS代码

var Data = {
    width: 400,
    height: 200,
    someString: "somedata"
};

$.ajax({
    type: "POST",
    url: "Service1.svc/testMethod",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    timeout: 1000000,               
    data:  '{"jsonData": "' + escape(JSON.stringify(Data)) + '"}',
    error: function(error) {
    },
    success: function (data) {
    },
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多