如何通过WCF序列化Dictionary <string,string>?

Hug*_*ugh 21 wcf serialization

我有一个数据合同,数据成员输入为Dictionary<string, string>.

生成的Web服务引用将其公开为具有该类型的成员ArrayOfKeyValueOfstringstringKeyValueOfstringstring[].

谁看过这个吗?

Mar*_*ann 24

WCF只序列化结构,因为最终在线上的内容必须足够自包含,对任何客户端都有用,而不仅仅是.NET客户端.

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

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

字典不仅仅是结构 - 它还包含行为(例如,当您分配已存在的密钥时,您覆盖该密钥等),并且该行为无法通过网络传输.

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

您可能最好为数据设计自定义DataContract.

  • 这并不意味着无法生成客户端代理以将数据转换回字典.当设置为System.Collections.Generic.Dictionary时,Visual Studio的"配置服务引用"对话框的"字典集合类型"选项会做什么? (2认同)

Phi*_*ppe 5

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

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

我要做的是创建我自己的数据类型,[DataContract]它,使它有两个String类型的字段,然后制作一个你在"字典"中找到的内容的集合.然后通过电线发送该集合,然后将其转换回另一侧的字典.

  • @kenny:坦率地说.是.并且有很多人使用非常自然的键和值xml元素编写可序列化的词典.字典只是一对列表.唯一有效的论据是Mark Seemann关于行为的论证.但是字典肯定不难在xml中表示.python也很好地序列化字典,使用与代码本身相同的表示!只需要`str(mydict)`来获得它. (2认同)