尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
小心DataContractJsonSerializer和JavaScriptSerializer的内部实现差异
问题的引子先来看问题的引子。定义一个下面这样的类此类有Serializable属性并且有一个属性的定义没有使用自动属性来实现。1[Serializable]2publicclassUsers3{4publicintUserID {get;set; }56publicstringUserName {get;set; }78publicstringUserEmail {get;set; }910privatestring_testProperty;11publicstringTestProperty12{13get{return_testProperty; }14set{ _testProperty value; }15}16}然后分别使用DataContractJsonSerializer和JavaScriptSerializer对此对象的示例进行序列化。使用DataContractJsonSerializer序列化后的结果。{_testProperty:TestPropertyValue,UserEmailk__BackingField:parrycnblogs.com,UserIDk__BackingField:1,UserNamek__BackingField:Parry}使用JavaScriptSerializer序列化后的结果。{UserID:1,UserName:Parry,UserEmail:parrycnblogs.com,TestProperty:TestPropertyValue}DataContractJsonSerializer和JavaScriptSerializer的实现差异DataContractJsonSerializer在.NET Framework 3.5中引入主要因为WCF的引入而添加了这个对象序列化的基本方法并且微软同时将JavaScriptSerializer打上了过时obsolete的标签编译时就会有警告出现。而在.NET Framework 3.5 SP1中微软又将JavaScriptSerializer的“过时”标签给去掉了。使用Reflector去比较这两个类的内部实现发现DataContractJsonSerializer在对象序列化时进行了更为严格的检查感兴趣的可以去System.Runtime.Serialization.Json下面的核心方法InternalWriteObjectContent去看其实现。而在.NET Framework 3.5引入的自动属性实际上就是个语法糖编译器还是会生成一个int类型的Namek_BackingField的私有字段作为这个属性的后端字段内部还是和以前的get/set方法一样。所以直接使用DataContractJsonSerializer进行序列化时又将编译器生成的k_BackingField带了出来。而JavaScriptSerializer的实现则非常简单将属性名和属性值分别存储在Dictionary里然后进行字符串拼接返回而已所以对类定义几乎没有检查并且对复杂类的支持不太好。下面是JavaScriptSerializer里面的核心方法SerializeValue的实现。1privatevoidSerializeValue(objecto, StringBuilder sb,intdepth, Hashtable objectsInUse,2SerializationFormat serializationFormat, MemberInfo currentMember null) {3if(depth _recursionLimit) {4thrownewArgumentException(AtlasWeb.JSON_DepthLimitExceeded);5}67//Check whether a custom converter is available for this type.8JavaScriptConverter converter null;9if(o !null ConverterExistsForType(o.GetType(),outconverter)) {10IDictionarystring,object dict converter.Serialize(o,this);1112if(TypeResolver !null) {13stringtypeString TypeResolver.ResolveTypeId(o.GetType());14if(typeString !null) {15dict[ServerTypeFieldName] typeString;16}17}1819sb.Append(Serialize(dict, serializationFormat));20return;21}2223SerializeValueInternal(o, sb, depth, objectsInUse, serializationFormat, currentMember);24}解决方法如果一定要使用DataContractJsonSerializer只有当为类加上[DataContract]属性并且为需要序列化的属性加上[DataMember]后使用DataContractJsonSerializer才可以生成干净、整洁的JSON数据。而当我们使用一些不能修改的类定义如上面的Users类定义我们没有权限去修改其定义那么就可以使用JavaScriptSerializer去进行JSON序列化。当然第三方的Json.NET(Newtonsoft.Json)也是可以实现的并且在支持的功能和效率方面往往是一个更好的选择在这里看它和DataContractJsonSerializer以及JavaScriptSerializer的使用对比。所以在使用时需要稍微注意下这三个JSON序列化方法的差异根据自己的需求灵活选择合适的组件。
RELATED

相关推荐

UE5集成3D高斯溅射渲染:XV3DGS插件实战避坑指南

UE5集成3D高斯溅射渲染:XV3DGS插件实战避坑指南

1. 项目概述:当UE5遇见3D高斯渲染 如果你是一个UE5的开发者或者技术美术,最近肯定没少被“3D高斯溅射”这个词刷屏。这个从NeRF等神经渲染领域杀出来的技术,凭借其惊人的重建质量和飞快的渲染速度,迅速成为了三维重建和实时渲染的…

📅 2026/9/5 2:03:00
[中文版] 可视化 CSS References 文档

[中文版] 可视化 CSS References 文档

本文分享了我将可视化 CSS References 文档翻译成中文版的介绍,翻译工作还在陆续进行中,供学习 CSS 参考。 1. 可视化 CSS References 文档介绍 许多 CSS 的文档都是属性的介绍,而开源项目 css-reference 并没有提供中文版,而当我…

📅 2026/9/8 18:03:10
获取任意链接文章正文 API 功能简介

获取任意链接文章正文 API 功能简介

此文章对开放数据接口 API 之「获取任意链接文章正文」进行了功能介绍、使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用。 1. 产品功能 接口开放了根据提供的文章链接 Url 参数,智能分析文章的正文部分,并通过抓取分析后&am…

📅 2026/9/9 14:27:43
MORE NEWS

更多资讯

📰

从晶体管到程序执行:CPU如何跑起你的代码

从第一次翻开计算机组成原理教材,到真正写出第一行能跑的汇编,再到后来用逻辑门芯片在面包板上搭出一个完整的8位加法器,我一直觉得“程序到底是怎么跑起来的”这个问题,是整个计算机学科里最值得反复琢磨的事情。很多人写了好几年…

📰

大模型供应商锁定怎么破?四步设计你的模型逃生通道

1. 供应商锁定:数字化转型里的一颗暗雷先说个发生在身边的真实场景。去年帮一家制造企业做AI质检项目选型,业务部门拿来一个方案:直接调某大厂的通用大模型API,把产品图片识别、工艺问答、设备日志总结全包了。演示效果特别好&…

📰

PredictionIO 命令行(pio CLI)完全指南:命令体系、参数详解与引擎实战流程

PredictionIO 命令行(pio CLI)完全指南:命令体系、参数详解与引擎实战流程 【免费下载链接】predictionio PredictionIO, a machine learning server for developers and ML engineers. 项目地址: https://gitcode.com/gh_mirrors/pred/pre…

📰

Dify+Cursor 搭建AI工作流实践指南:用 TaoToken 统一 Key 打通 DSL 与 MCP 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

美国新移民图解原理:3个避坑点搞定技术落地

美国新移民图解原理:3个避坑点搞定技术落地 版本升级后 API 全变了,这是很多刚拿到绿卡或工签、准备在美国独立接活或入职的开发者最头疼的事。你在国内用惯了 Vue 2 或者 Spring Boot 2 ,到了美国公司,代码库里全是…

📰

Apache PredictionIO PMC 版本发布全流程指南:从签名密钥到正式公告的 27 个标准步骤

机器学习后端推荐系统 【免费下载链接】predictionio PredictionIO, a machine learning server for developers and ML engineers. 项目地址: https://gitcode.com/gh_mirrors/pred/predictionio 点击查看 免费下载 本指南以 Apache PredictionIO 项目根目录下的 …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬