天天看點

序列化效率比拼——誰是最後的赢家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比較強。

以上隻是樓主自己做的簡單測試,可能存在不夠嚴謹的地方,望各位大蝦拍磚指正~~

附上源碼:源碼下載下傳。