DataContractJsonSerializer和JavaScriptSerializer有什么区别?

88
.NET Framework提供了System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer两种工具,用于JSON的序列化和反序列化。我该如何选择这两种工具呢?MSDN并没有明确它们的优劣之处。
我们有几个项目需要处理JSON数据,每个项目都由主要的开发人员根据自己的意见来选择使用哪种类。其中一些项目比较简单,另外两个项目则需要将JSON数据转换为复杂的托管类型(这些类型与流并不完全对应),但并不强调速度,而另一个项目则需要快速处理数据。目前,这些项目都没有与WCF进行交互。
虽然我也对其他库感兴趣,但我希望能够找到一个答案来解决我的问题。

8
使用Json.Net http://json.codeplex.com/。你将会拥有更多关于序列化/反序列化过程的控制。 - L.B
取决于你如何使用它。DataContractJsonSerializer 倾向于与 WCF 配合良好。JavaScriptSerializer 则更简单。你想要做什么? - jrummell
使用ServiceStack.JsonSerializer-它是最快的。但它不会遵守[ScriptIgnore]属性。如果您不需要它,则不是问题。在这里查看有关此的长时间讨论:https://dev59.com/pWDVa4cB1Zd3GeqPZhPV - Ofer Zelig
18
为什么每个人都把他们的答案放在评论里?这使得对答案进行投票或发表评论变得困难。 - Justin R.
3
或许是因为这里有一些警察会对一行回答进行投票,并说:“这应该是评论”。 - nawfal
3个回答

68
DataContractJsonSerializer用于WCF客户端应用程序,其中序列化的类型通常是带有DataContract属性的POCO类。没有DataContract就无法进行序列化。WCF的映射机制使得发送和接收非常简单,但前提是您的平台是同构的。如果混合使用不同的工具集,程序可能会出现问题。
JavaScriptSerializer可以序列化任何类型,包括匿名类型(单向),并以更符合规范的方式执行此操作。您会失去WCF的“自动魔力”,但可以获得更多的集成选项。
正如您在评论中看到的那样,存在许多AJAX序列化选项,为了解决速度与可维护性问题,值得调查它们以找到满足所有团队需求的解决方案,以减少长期维护问题,因为每个人都有自己的做事方式。
2014-04-07更新: 如果可以,建议使用JSON.NET。请参见http://james.newtonking.com/json 功能比较,以回顾本问题考虑的3个库。
2015-05-26更新: 如果您的公司要求使用商业许可产品,或者需要每一点性能,请还要查看https://servicestack.net/

2
它们两者之间的序列化性能差异是什么?假设它们将序列化相同数量的实体,具有相同数量的属性? - Adrian Salazar

21

两者大致相同,但使用非常不同的基础架构,因此对要序列化/反序列化的类施加不同的限制,并在调整序列化/反序列化过程的灵活性方面提供不同的程度。

对于 DataContractJsonSerializer,您必须使用 DataContract 属性标记所有要序列化的类以及所有成员使用 DataMember 属性。 如果您的某些类有枚举成员,则还必须将枚举标记为 DataContract,并使用 EnumMember 属性标记每个枚举成员。 此外,DataContractJsonSerializer 允许您通过更改类型解析逻辑并替换要序列化的类型与代理进行精细控制整个序列化/反序列化过程。

对于 JavaScriptSerializer,如果您计划从json字符串反序列化对象,则必须提供无参构造函数。

对于我来说,我通常在演示逻辑中使用 JavaScriptSerializer,其中有一个我想与页面一起呈现的简单模型Json,无需额外的ajax请求。 而且,我通常甚至都不需要将它们反序列化回C# - 所以完全没有开销。 但如果是持久性逻辑,我想将对象保存到数据存储中(通常是无SQL存储),以便以后加载它们,我更喜欢使用 DataContractJsonSerializer,因为放置属性的开销值得在序列化/反序列化过程调整方面的灵活性,特别是当涉及将序列化数据加载到具有更新定义的新版本对象中时。


2

个人认为,DataContractJsonSerializer 过于过度设计。我会跳过它并使用 JavaScriptSerializer。如果 JavaScriptSerializer 不可用,您可以使用FridayThe13th(这是我编写的一个库 ;p)。


Json.Net 随处可见。.Net 2.0、3.5、4.0、Silverlight、WindowsPhone。 - L.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接