天天看点

序列化效率比拼——谁是最后的赢家Newtonsoft.Json

      前言:作为开发人员,对象的序列化恐怕难以避免。楼主也是很早以前就接触过序列化,可是理解都不太深刻,对于用哪种方式去做序列化更是随波逐流——项目中原来用的什么方式照着用就好了。可是这么多年自己对于这东西还是挺模糊的,今天正好有时间,就将原来用过的几种方式总结了下,也算是做一个记录,顺便做了下性能测试。楼主算了下,从使用序列化到现在,用到的无非下面几种方式:(1)JavaScriptSerializer方式;(2)DataContract方式;(3)Newtonsoft.Json.

1、准备工作:要对这三种方式分别作测试,必须要将相应的内库引用进来。

(1)JavaScriptSerializer这个类是.Net内置的,属于System.Web.Script.Serialization这个命名空间下面。需要引用System.Web.Extensions这个dll。

(2)DataContract方式也是.net内置的,主要使用的DataContractJsonSerializer这个类,属于System.Runtime.Serialization.Json这个命名空间。需要引用System.Runtime.Serialization这个dll。

(3)Newtonsoft.Json是第三方的dll,但是Visual Studio 对它做了很好的支持。使用方式有两种:一种是去网上下载最新的dll,然后添加引用即可;第二种是直接使用NuGet安装这个包。方式如下:

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

按照步骤安装即可。

2、类库准备完毕,还需要提供几个通用的方法。自己分别封装了JavaScriptSerializer和DataContract方式两个方法,代码如下:

至于Newtonsoft.Json,自己有对应的方法,自己也封装了几个方法:

还有就是提供测试数据的两个方法:

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

View Code

3、测试开始之前,先介绍下,本篇测试分别通过强类型对象和若类型的DataTable分别去做序列化和反序列化的测试。测试代码:

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

4、测试结果:

先说强类型对象的结果:

(1)集合数量100和1000时,序列化和反序列化三种方式差别不大:

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

(2)当超过10000时,

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

(3)继续加大数据量

序列化效率比拼——谁是最后的赢家Newtonsoft.Json
序列化效率比拼——谁是最后的赢家Newtonsoft.Json

弱类型DataTable的测试结果:

JavaScriptSerializer方式直接报错:

序列化效率比拼——谁是最后的赢家Newtonsoft.Json

DataContract方式需要提供DataTable的表名,序列化得到是DataTable的Xml

序列化效率比拼——谁是最后的赢家Newtonsoft.Json

Newtonsoft.Json方式可以实现和Json数据的序列化和反序列化。

序列化效率比拼——谁是最后的赢家Newtonsoft.Json

5、测试总结:

(1)总的来说,DataContract和Newtonsoft.Json这两种方式效率差别不大,随着数量的增加JavaScriptSerializer的效率相对来说会低些。

(2)对于DataTable的序列化,如果要使用json数据通信,使用Newtonsoft.Json更合适,如果是用xml做持久化,使用DataContract合适。

(3)随着数量的增加JavaScriptSerializer序列化效率越来越低,反序列化和其他两种相差不大。

(4)后来发现当对象的DataTime类型属性不赋值时,DataContract和JavaScriptSerializer这两种方式序列化都会报错,而用Newtonsoft.Json方式可以正常序列化。所以看来在容错方便,还是Newtonsoft.Json比较强。

以上只是楼主自己做的简单测试,可能存在不够严谨的地方,望各位大虾拍砖指正~~

附上源码:源码下载。