【问题标题】:Any way to make DataContractJsonSerializer serialize Dictionaries properly?有什么方法可以使 DataContractJsonSerializer 正确序列化字典?
【发布时间】:2011-06-01 09:26:02
【问题描述】:

DataContractJsonSerializer 无法正确序列化字典。

而 JavaScriptSerializer 将字典序列化为 {"abc":"xyz","def":42} 例如, DataContractJsonSerializer 改为提供[{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}]

这确实有问题,我想知道如何在我的 WCF 服务中正确序列化 Dictionary 对象。我正在寻找一种需要最少努力的解决方案。

参考:http://msdn.microsoft.com/en-us/library/bb412170.aspx

这是我最终用来在 WCF 中正确序列化字典的解决方法:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771

【问题讨论】:

标签: .net wcf serialization


【解决方案1】:

使用DataContractJsonSerializerSettings(从 .NET 4.5 开始可用)可以为您做到这一点:

var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings()
{
    UseSimpleDictionaryFormat = true 
});

【讨论】:

  • 你好,当我在代码中创建服务主机时,我在哪里可以用这个序列化器替换“普通”序列化器?
【解决方案2】:

不幸的是,这似乎是设计使然,根据 http://msdn.microsoft.com/en-us/library/bb412170.aspx 的“集合、字典和数组”部分所述

所有集合、字典和数组都在 JSON 中表示为 数组。

【讨论】:

    【解决方案3】:

    虽然这在大多数情况下会导致重大重写,因此不可行,但您可以让 WCF 服务接口接受并返回Stream,在这种情况下,您可以完全控制序列化。这样您就可以使用JavaScriptSerializerJSON.NETServiceStack.JSON 来执行实际的序列化,这些序列化程序实际上以更明智的方式处理字典。

    【讨论】:

    • 你的意思是字符串而不是流吗?
    • @Markus:不,我没有。字符串不能让您控制序列化,它为方法提供强制某种搅拌输入的签名,而按照惯例,Stream 指示 WCF 您要控制序列化。我不认为这两种解决方案可以互换。
    • 嗯...我认为返回类型的字符串也不会被处理,但似乎不是这样?否则使用流而不是字符串会笨拙,IMO。
    • 我想这取决于:如果您使用的是 Xml 样式序列化,它将被包装。 Json(这当然是这个问题的关键)可能是另一个问题,因为你可能会让它工作。这不会改变 WCF 将 Streams 用作输入和返回类型的特殊用途。主要是性能问题,不过关于序列化的控制也是一个重点。 (WCF 只是停止所有序列化拦截,并留给您为什么它也比让 WCF 拦截您建议的字符串更快,然后您执行不同的序列化。)
    • 正确,Stream 会比字符串执行得更好(因为字符串不会受到序列化阶段的影响),并且会逐字节保证有效负载通过 WCF 格式化和序列化保持不变。当然,其他阶段可以修改它,但就序列化而言不是。这是解决问题的务实方法。
    【解决方案4】:

    DataContractJsonSerializerSettings 现在具有 UseSimpleDictionaryFormat 属性,它可以按照您的预期方式序列化字典。

    【讨论】:

    • 在代码中创建服务主机时,在哪里可以用这个序列化器替换“普通”序列化器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2010-09-10
    • 2011-05-17
    相关资源
    最近更新 更多