认识k_BackingField

简介:

事情从Json的序列化和反序列化说起。

在C#2.0的项目中,以前经常使用Json.Net实现序列化和反序列化。后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作。微软提供的原生类库使用上并不复杂,参考一下msdn你很容易就会写出序列化和反序列化的方法,比如经常被人使用的泛型方法如下:

JsonHelper

 

不过使用该类库方法的过程中还是不慎意外发现了k_BackingField

举例之前说一下我们的一个简单的实体类Person,它有如下定义:

Person

 

如果Person没有附加任何特性,经测试,可以成功使用上述泛型方法进行处理。

Test

 

而且json生成是正常的字符串:

{"Birthday":"\/Date(428688000000+0800)\/","FirstName":"jeff","Id":1,"LastName":"wong"}

 

可是当我们把Person实体上面设置Serializable特性后,莫名,我就很不解了:

{"<Birthday>k__BackingField":"\/Date(428688000000+0800)\/","<FirstName>k__BackingField":"jeff","<Id>k__BackingField":1,"<LastName>k__BackingField":"wong"}

 

搜索了一下,果然早就有人发现了类似的问题。后来上stackoverflow一查,查到好像和自动属性有点关系,大家可以看一下这一篇这一篇,而且评论比原帖精彩好像国内外大部分都是一致的。

有人说用Reflector反汇编可以看到自动属性生成的字段有前缀,可惜我一直使用ILSpy,兴致勃勃反编译查看了一下,没有没有是真的没有啊。

到这里你可能会想到,自动属性json会有k_BackingField前缀,那传统那种属性的写法呢?

Person

 

OK,我们想一块去了,经测试,带Serializable特性的Person类,输出json一点问题没有:

{"birthday":"\/Date(428688000000+0800)\/","firstName":"jeff","id":1,"lastName":"wong"}

 

但是,请注意大小写(我挖了一个坑,上面的json是序列化属性吗?首字母有没有大写?)。

有没有兼容方式使自动属性输出json也正常呢?很简单,使用DataContractDataMember属性,哪一种写法输出json都没有问题的:

Person

 

json输出带有k_BackingField前缀的问题可能非常简单,这里只是善意地提醒,我个人曾经有过“惨痛”的教训,而且感觉还相当隐蔽,大家也要小心啊。

最后,在使用.net framework自带的json有关类库的时候还碰到过特殊符号和时间格式转换的问题,网上有不少文章都讲到,相信不少人也有类似经历,这里就不说了。





本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2012/05/31/2529196.html,如需转载请自行联系原作者


目录
相关文章
|
安全 Java API
解决 Swagger API 未授权访问漏洞:完善分析与解决方案
Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面,让开发者可以更方便地查看和测试 API 接口。然而,在一些情况下,未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 Swagger API 未授权访问漏洞问题。
|
8月前
|
XML 前端开发 JavaScript
使用 AJAX 提升网页数据的动态交互
使用 AJAX 提升网页数据的动态交互
|
4月前
|
JSON Java 数据格式
使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“
本文介绍了使用Postman调试接口时遇到的“Content type ‘multipart/form-data;charset=UTF-8’ not supported”错误,原因是Spring Boot接口默认只接受通过`@RequestBody`注解的请求体,而不支持`multipart/form-data`格式的表单提交。解决方案是在Postman中将请求体格式改为`raw`并选择`JSON`格式提交数据。
使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“
|
JavaScript
vue踩坑-This relative module was not found
vue踩坑-This relative module was not found
226 0
|
6月前
|
存储 SQL 数据库
influxdb 连续查询使用总结
influxdb 连续查询使用总结
231 0
|
JavaScript 前端开发
JS之url进行编码和解码(三种方式)
JS之url进行编码和解码(三种方式)
16985 1
|
消息中间件 存储 Java
kafkaStream处理实时流式计算
kafkaStream处理实时流式计算
198 0
|
分布式计算 Hadoop
几种压缩方式及各自优缺点【重点】
几种压缩方式及各自优缺点【重点】
891 0
|
存储 弹性计算 缓存
阿里云服务器新老用户优惠价格表及收费标准(2023最新更新)
租用阿里云服务器一年多少钱?阿里云服务器分为云服务器ECS和轻量应用服务器,通常轻量应用服务器会作为特价云服务器推出,不同时期阿里云服务器的租用价格不同,2023年,阿里云继续推出各种云服务器优惠政策,目前轻量应用服务器特价108元起,共享型s6实例云服务器1核1G配置651.78元/1年起,计算型c6实例云服务器2核4G配置1685.04元/1年起,通用算力型u1实例4核8G配置1367.86元/1年起,海外地域云服务器最低3171.04元/1年起,更多配置的阿里云服务器价格表见下文。
阿里云服务器新老用户优惠价格表及收费标准(2023最新更新)
|
前端开发 JavaScript
论如何用Vue实现一个弹窗-一个简单的组件实现
最近在使用element-ui框架,用到了Dialog对话框组件,大致实现的效果,跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下,下面本文会带着大家手摸手实现一个弹窗组件。 本文主要内容会涉及到弹窗遮罩的实现,slot插槽的使用方式,props、$emit传参,具体组件代码也传上去了。如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。
2601 0
论如何用Vue实现一个弹窗-一个简单的组件实现