DataContractJsonSerializer和JavaScriptSerializer有什么区别?


88

.NET Framework随System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer一起提供,它们都对JSON进行反序列化。我怎么知道何时选择这些类型中的一种?MSDN尚不清楚它们的相对优势是什么。

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

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


8
使用Json.Net json.codeplex.com。您将对序列化/反序列化过程有更多控制。
LB

取决于您的使用方式。DataContractJsonSerializer倾向于与WCF配合使用。JavaScriptSerializer更加简单。你想做什么?
jrummell 2012年

使用ServiceStack.JsonSerializer-这是最快的。但是它不支持[ScriptIgnore]属性。如果您不需要它,这不是问题。在这里看到关于它的长时间的讨论:stackoverflow.com/questions/9150920/...
奥弗泽里格柯

18
为什么每个人都在评论中回答他们的问题?这使得很难对答案进行投票或对其进行评论。
贾斯汀·R。

3
@JustinR。也许是因为这里有一些警察会拒绝一行答复并说:“这应该是评论”。
nawfal 2014年

Answers:


68

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

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

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

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

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


2
两者之间的序列化性能有何不同?假设他们将序列化具有相同数量属性的相同数量实体?
Adrian Salazar 2013年

20

两者的作用大致相同,但使用的基础设施却大不相同,因此对要序列化/反序列化的类施加了不同的限制,并在调整序列化/反序列化过程中提供了不同程度的灵活性。

因为DataContractJsonSerializer您必须使用DataContractatrtibute 标记要序列化的所有类,并使用DataMemberattribute 标记所有成员。就像您的某些类中有枚举成员一样,枚举也必须标记为DataContract和每个枚举成员-具有EnumMember属性。还DataContractJsonSerializer可以通过更改类型解析逻辑并用代理替换序列化的类型来对序列化/反序列化的整个过程进行精细控制。

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

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


2

就我个人而言,我认为DataContractJsonSerializer过度设计是很必要的。我会跳过它,然后继续JavaScriptSerializer。如果JavaScriptSerializer无法使用,可以使用FridayThe13th(我写的库; p)。


Json.Net无处不在。.Net 2.0、3.5、4.0,Silverlight,WindowsPhone
LB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.