DataContractJsonSerializer和JavaScriptSerializer有什么区别?

.NET Framework附带了System.Runtime.Serialization.Json.DataContractJsonSerializer和System.Web.Script.Serialization.JavaScriptSerializer ,它们都是对JSON进行de / serialize。 我怎么知道什么时候select这些types之一? MSDN并没有说清楚它们的相对优势是什么。

我们有几个消耗或放出JSON的项目,到目前为止select的类都依赖于小项目对每个项目的意见。 有些很简单,有两个关于从JSON生成托pipetypes的复杂逻辑(这些types并不紧密地映射到stream),但没有强调速度,需要速度。 没有任何与WCF交互,至less现在。

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

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

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

从评论中可以看出,AJAX序列化有很多选项,为了解决速度问题和可维护性问题,可能需要调查他们以find满足所有团队需求的解决scheme从长远来看减less可维护性问题,因为每个人都以自己的方式行事。

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

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

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

对于DataContractJsonSerializer您必须使用DataContract atrtibute标记要序列化的所有类,并使用DataMember属性标记所有成员。 以及如果您的某些类有枚举成员,那么枚举也必须标记为DataContract和每个枚举成员 – 具有EnumMember属性。 另外, DataContractJsonSerializer允许您通过更改typesparsing逻辑并用替代序列replace序列化的types来精确控制序列化/反序列化的整个过程。

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

对我来说,我通常在表示逻辑中使用JavaScriptSerializer ,在那里有一个简单的模型,我想在Json中和页面一起呈现,而不需要额外的Ajax请求。 我甚至通常不需要反序列化他们回到C# – 所以没有任何开销。 但是,如果是持久性逻辑,我希望将对象保存到数据存储(通常是非sql存储),稍后加载它们,我更喜欢使用DataContractJsonSerializer因为在序列化/反序列化过程调整中,放置属性的开销是值得的尤其是在将序列化数据加载到新版本的对象中时,更新定义

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