什么';s DataContractJsonSerializer和JavaScriptSerializer之间的区
本文关键字:JavaScriptSerializer 之间 DataContractJsonSerializer 什么 | 更新日期: 2023-09-27 18:24:40
.NET Framework附带System.Runtime.Serialization.Json.DataContractJsonSerializer和System.Web.Script.Serialization.JavaScriptSerializer,这两个工具都对Json进行反序列化。我如何知道何时从这些类型中选择一种而不是另一种?MSDN没有明确说明它们的相对优势是什么。
我们有几个使用或发出JSON的项目,到目前为止,为每个项目选择的类取决于主开发人员对每个项目的意见。有些很简单,两个有复杂的逻辑,从JSON生成托管类型(类型与流不紧密映射),但不强调速度,一个需要速度。至少到目前为止,没有人与WCF交互。
虽然我对其他图书馆感兴趣,但我希望有人也能回答我的问题。
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/.
两者的功能大致相同,但使用的基础设施非常不同,因此对要序列化/反序列化的类应用了不同的限制,并在调整序列化/反串行化过程时提供了不同程度的灵活性。
对于DataContractJsonSerializer
,必须使用DataContract
属性标记要序列化的所有类,并使用DataMember
属性标记所有成员。如果某些类具有枚举成员,则枚举也必须标记为DataContract
,并且每个枚举成员都具有EnumMember
属性。此外,DataContractJsonSerializer
允许您通过更改类型解析逻辑和用代理替换序列化的类型来精细控制序列化/反序列化的整个过程。
对于JavaScriptSerializer
,如果您计划从json字符串反序列化对象,则必须提供无参数构造函数。
对我来说,我通常在表示逻辑中使用JavaScriptSerializer
,其中有一个简单的模型,我想在Json中与页面一起呈现,而不需要额外的ajax请求。而且我通常甚至不必将它们反序列化回c#,所以根本没有开销。但是,如果是持久性逻辑,我想将对象保存到数据存储(通常没有sql存储)中,以便稍后加载它们,我更喜欢使用DataContractJsonSerializer
,因为在序列化/反序列化过程调优中,放置属性的开销值得灵活,尤其是在将序列化数据加载到更新版本的对象中时,使用更新的定义
就我个人而言,我认为DataContractJsonSerializer
有点过于工程化的味道。我会跳过它,选择JavaScriptSerializer
。如果JavaScriptSerializer
不可用,您可以使用FridayThe13th(我写的一个库;p)。