C#序列化效率對比


原文出處:https://www.cnblogs.com/landeanfen/p/4627383.html

從使用序列化到現在,用到的無非下面幾種方式:(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安裝這個包。方式如下:

按照步驟安裝即可。

 

2、類庫准備完畢,還需要提供幾個通用的方法。自己分別封裝了JavaScriptSerializer和DataContract方式兩個方法,代碼如下:

復制代碼
    #region DataContract序列化
    public static class DataContractExtensions { /// <summary> /// 將對象轉化為Json字符串 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="instanse">對象本身</param> /// <returns>JSON字符串</returns> public static string ToJsonString<T>(this T instanse) { try { DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { js.WriteObject(ms, instanse); ms.Flush(); ms.Seek(0, SeekOrigin.Begin); StreamReader sr = new StreamReader(ms); return sr.ReadToEnd(); } } catch { return String.Empty; } } /// <summary> /// 將字符串轉化為JSON對象,如果轉換失敗,返回default(T) /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="s">字符串</param> /// <returns>轉換值</returns> public static T ToJsonObject<T>(this string s) { try { DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { StreamWriter sw = new StreamWriter(ms); sw.Write(s); sw.Flush(); ms.Seek(0, SeekOrigin.Begin); return (T)js.ReadObject(ms); } } catch { return default(T); } } } #endregion #region JavaScriptSerializer方式序列化 public static class JavascriptExtentions { public static string ToScriptJsonString<T>(this T instanse) { try { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Serialize(instanse); } catch { return String.Empty; } } public static T ToScriptJsonObject<T>(this string s) { try { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Deserialize<T>(s); } catch { return default(T); } } } #endregion
復制代碼

至於Newtonsoft.Json,自己有對應的方法,自己也封裝了幾個方法:

復制代碼
public class Newtonsoft_Common { #region 序列化 // 將對象(包含集合對象)序列化為Json public static string SerializeObjToJson(object obj) { string strRes = string.Empty; try { strRes = JsonConvert.SerializeObject(obj); } catch { } return strRes; } //將xml轉換為json public static string SerializeXmlToJson(System.Xml.XmlNode node) { string strRes = string.Empty; try { strRes = JsonConvert.SerializeXmlNode(node); } catch { } return strRes; } //支持Linq格式的xml轉換 public static string SerializeXmlToJson(System.Xml.Linq.XNode node) { string strRes = string.Empty; try { strRes = JsonConvert.SerializeXNode(node); } catch { } return strRes; } #endregion #region 反序列化 //將json反序列化為實體對象(包含DataTable和List<>集合對象) public static T DeserializeJsonToObj<T>(string strJson) { T oRes = default(T); try { oRes = JsonConvert.DeserializeObject<T>(strJson); } catch { } return oRes; } //將Json數組轉換為實體集合 public static List<T> JsonLstToObjs<T>(List<string> lstJson) { List<T> lstRes = new List<T>(); try { foreach (var strObj in lstJson) { //將json反序列化為對象 var oRes = JsonConvert.DeserializeObject<T>(strObj); lstRes.Add(oRes); } } catch { } return lstRes; } #endregion }
復制代碼

 

 

還有就是提供測試數據的兩個方法:

View Code

 

3、測試開始之前,先介紹下,本篇測試分別通過強類型對象和若類型的DataTable分別去做序列化和反序列化的測試。測試代碼:

View Code

 

4、測試結果:

先說強類型對象的結果:

(1)集合數量100和1000時,序列化和反序列化三種方式差別不大:

(2)當超過10000時,

(3)繼續加大數據量

 

 

弱類型DataTable的測試結果:

JavaScriptSerializer方式直接報錯:

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

 

Newtonsoft.Json方式可以實現和Json數據的序列化和反序列化。

 

5、測試總結:

(1)總的來說,DataContract和Newtonsoft.Json這兩種方式效率差別不大,隨着數量的增加JavaScriptSerializer的效率相對來說會低些。

(2)對於DataTable的序列化,如果要使用json數據通信,使用Newtonsoft.Json更合適,如果是用xml做持久化,使用DataContract合適。

(3)隨着數量的增加JavaScriptSerializer序列化效率越來越低,反序列化和其他兩種相差不大。

(4)后來發現當對象的DataTime類型屬性不賦值時,DataContract和JavaScriptSerializer這兩種方式序列化都會報錯,而用Newtonsoft.Json方式可以正常序列化。所以看來在容錯方便,還是Newtonsoft.Json比較強。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM