DataContractJsonSerializer和JavaScriptSerializer有什么区别?

Jus*_* R. 87 c# serialization json deserialization

.NET Framework附带了System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer,它们都是对JSON进行de/serialize.我如何知道何时选择其中一种类型?MSDN没有说清楚它们的相对优势是什么.

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

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

Bah*_*gor 67

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/.

  • 这两者之间的*序列化*性能差异是什么?让我们说他们将序列化具有相同数量属性的相同数量的实体? (2认同)

ach*_*ekh 20

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

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

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

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