DataContractJsonSerializer 和 JavaScriptSerializer 有啥区别?

Posted

技术标签:

【中文标题】DataContractJsonSerializer 和 JavaScriptSerializer 有啥区别?【英文标题】:What's the difference between DataContractJsonSerializer and JavaScriptSerializer?DataContractJsonSerializer 和 JavaScriptSerializer 有什么区别? 【发布时间】:2012-03-07 07:06:26 【问题描述】:

.NET Framework 附带 System.Runtime.Serialization.Json.DataContractJsonSerializer 和 System.Web.Script.Serialization.javascriptSerializer,它们都对 JSON 进行反序列化/序列化。我怎么知道何时选择其中一种类型而不是另一种? MSDN 并没有明确说明它们的相对优势是什么。

我们有几个使用或发出 JSON 的项目,到目前为止,为每个项目选择的类取决于每个项目的主要开发人员的意见。有些很简单,有两个具有复杂的逻辑,涉及从 JSON 生成托管类型(这些类型不紧密映射到流),但不强调速度,一个需要速度。至少到目前为止,没有人与 WCF 交互。

虽然我对替代库感兴趣,但我希望有人也能回答我的问题。

【问题讨论】:

使用 Json.Net json.codeplex.com 。您将对序列化/反序列化过程有更多的控制权。 取决于你如何使用它。 DataContractJsonSerializer 倾向于与 WCF 很好地配合使用。 JavaScriptSerializer 要简单得多。你想做什么? 使用 ServiceStack.JsonSerializer - 这是最快的。但它不尊重 [ScriptIgnore] 属性。如果您不需要它,这不是问题。在此处查看有关它的长时间讨论:***.com/questions/9150920/… 为什么每个人都将答案放在 cmets 中?很难对答案进行投票或评论。 @JustinR。也许是因为这里的一些警察会否决一行答案并说:“这应该是一条评论”。 【参考方案1】:

DataContractJsonSerializer 旨在与 WCF 客户端应用程序一起使用,其中序列化类型通常是应用了 DataContract 属性的 POCO 类。没有 DataContract,没有序列化。 WCF 的映射机制使发送和接收非常简单,但前提是您的平台是同构的。如果您开始混合使用不同的工具集,您的程序可能会跑偏。

JavaScriptSerializer 可以序列化任何类型,包括匿名类型(一种方式),并且以更一致的方式进行。您失去了 WCF 的“自动”功能,但获得了更多集成选项。

正如您从 cmets 看到的,AJAX 序列化有很多选项,为了解决您的速度与可维护性问题,可能值得研究它们以找到满足所有需求的解决方案团队,以减少长期的可维护性问题,因为每个人都以自己的方式做事。

2014-04-07 更新: 如果可以的话,我建议使用 JSON.NET。请参阅http://james.newtonking.com/json 功能比较,查看此问题中考虑的 3 个库。

2015-05-26 更新: 如果您的公司需要使用商业许可产品,或者您需要每一个性能,您可能还想查看https://servicestack.net/。

【讨论】:

两者在序列化性能上有什么区别?假设他们将序列化具有相同数量属性的相同数量的实体?【参考方案2】:

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

对于DataContractJsonSerializer,您必须使用DataContract 属性标记所有要序列化的类,并使用DataMember 属性标记所有成员。以及如果你们中的一些类有枚举成员,那么枚举也必须标记为DataContract 并且每个枚举成员 - 带有EnumMember 属性。 此外,DataContractJsonSerializer 允许您通过更改类型解析逻辑并将您序列化的类型替换为代理项来精细控制序列化/反序列化的整个过程。

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

对我来说,我通常在表示逻辑中使用JavaScriptSerializer,我想在 Json 中与页面一起呈现一个简单的模型,而无需额外的 ajax 请求。而且我什至通常不必将它们反序列化回 c# - 所以根本没有开销。但如果是持久化逻辑,我想将对象保存到数据存储(通常是无 sql 存储)中,以便稍后加载它们,我更喜欢使用DataContractJsonSerializer,因为放置属性的开销值得序列化/反序列化的灵活性流程调优,尤其是在将序列化数据加载到具有更新定义的较新版本的对象中时

【讨论】:

【参考方案3】:

就我个人而言,我认为DataContractJsonSerializer 有过度设计的味道。我会跳过它并使用JavaScriptSerializer。如果JavaScriptSerializer 不可用,您可以使用FridayThe13th(我写的一个库;p)。

【讨论】:

Json.Net 无处不在。 .Net 2.0、3.5、4.0、Silverlight、WindowsPhone

以上是关于DataContractJsonSerializer 和 JavaScriptSerializer 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章