DataContractJsonSerializer和JavaScriptSerializer有什么区别?

时间:2012-02-15 21:41:28

标签: c# json serialization deserialization

.NET Framework随System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer一起提供,两者都对JSON进行了序列化。我如何知道何时选择其中一种类型? MSDN没有说清楚它们的相对优势是什么。

我们有几个使用或发出JSON的项目,到目前为止为每个项目选择的类依赖于每个项目的主要开发者的意见。有些很简单,有两个有关于从JSON生成托管类型的复杂逻辑(类型没有紧密地映射到流)但是没有强调速度,需要速度。没有与WCF交互,至少截至目前。

虽然我对其他图书馆感兴趣,但我希望有人也可以回答我的问题。

3 个答案:

答案 0 :(得分:65)

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

JavaScriptSerializer可以序列化任何类型,包括匿名类型(单向),并以更一致的方式执行此操作。你失去了WCF的“自动化”,但你获得了更多的集成选项。

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

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

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

答案 1 :(得分:20)

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

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

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

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

答案 2 :(得分:2)

就我个人而言,我认为DataContractJsonSerializer过度工程。我会跳过它并与JavaScriptSerializer一起去。如果JavaScriptSerializer不可用,您可以使用FridayThe13th(我写的库; p)。