C#基礎系列:序列化效率比拼
前言:作為開發人員,物件的序列化恐怕難以避免。樓主也是很早以前就接觸過序列化,可是理解都不太深刻,對於用哪種方式去做序列化更是隨波逐流——專案中原來用的什麼方式照著用就好了。可是這麼多年自己對於這東西還是挺模糊的,今天正好有時間,就將原來用過的幾種方式總結了下,也算是做一個記錄,順便做了下效能測試。樓主算了下,從使用序列化到現在,用到的無非下面幾種方式:(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方式兩個方法,程式碼如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | #region DataContract序列化publicstaticclassDataContractExtensions{/// <summary>/// 將物件轉化為Json字串/// </summary>/// <typeparam name="T">物件型別</typeparam>/// <param name="instanse">物件本身</param>/// <returns>JSON字串</returns>publicstaticstringToJsonString<T>(thisTinstanse){try{DataContractJsonSerializer js=newDataContractJsonSerializer(typeof(T));using(MemoryStream ms=newMemoryStream()){js.WriteObject(ms,instanse);ms.Flush();ms.Seek(0,SeekOrigin.Begin);StreamReader sr=newStreamReader(ms);returnsr.ReadToEnd();}}catch{returnString.Empty;}}/// <summary>/// 將字串轉化為JSON物件,如果轉換失敗,返回default(T)/// </summary>/// <typeparam name="T">物件型別</typeparam>/// <param name="s">字串</param>/// <returns>轉換值</returns>publicstaticTToJsonObject<T>(thisstrings){try{DataContractJsonSerializer js=newDataContractJsonSerializer(typeof(T));using(MemoryStream ms=newMemoryStream()){StreamWriter sw=newStreamWriter(ms);sw.Write(s);sw.Flush();ms.Seek(0,SeekOrigin.Begin);return(T)js.ReadObject(ms);}}catch{returndefault(T);}}}#endregion#region JavaScriptSerializer方式序列化publicstaticclassJavascriptExtentions{publicstaticstringToScriptJsonString<T>(thisTinstanse){try{JavaScriptSerializer js=newJavaScriptSerializer();returnjs.Serialize(instanse);}catch{returnString.Empty;}}publicstaticTToScriptJsonObject<T>(thisstrings){try{JavaScriptSerializer js=newJavaScriptSerializer();returnjs.Deserialize<T>(s);}catch{returndefault(T);}}}#endregion |
至於Newtonsoft.Json,自己有對應的方法,自己也封裝了幾個方法:
C#123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | publicclassNewtonsoft_Common{#region 序列化// 將物件(包含集合物件)序列化為JsonpublicstaticstringSerializeObjToJson(objectobj){stringstrRes=string.Empty;try{strRes=JsonConvert.SerializeObject(obj);}catch{}returnstrRes;}//將xml轉換為jsonpublicstaticstringSerializeXmlToJson(System.Xml.XmlNode node){stringstrRes=string.Empty;try{strRes=JsonConvert.SerializeXmlNode(node);}catch{}returnstrRes;}//支援Linq格式的xml轉換publicstaticstringSerializeXmlToJson(System.Xml.Linq.XNode node){stringstrRes=string.Empty;try{strRes=JsonConvert.SerializeXNode(node);}catch{}returnstrRes;}#endregion#region 反序列化//將json反序列化為實體物件(包含DataTable和List<>集合物件)publicstaticTDeserializeJsonToObj<T>(stringstrJson){ToRes=default(T);try{oRes=JsonConvert.DeserializeObject<T>(strJson);}catch{}returnoRes;}//將Json陣列轉換為實體集合publicstaticList<T>JsonLstToObjs<T>(List<string>lstJson){List<T>lstRes=newList<T>();try{foreach(varstrObj inlstJson){//將json反序列化為物件varoRes=JsonConvert.DeserializeObject<T>(strObj);lstRes.Add(oRes);}}catch{}returnlstRes;}#endregion} |
還有就是提供測試資料的兩個方法:
C#123456789101112131415161718192021222324252627282930313233343536373839404142434445 | publicstaticList<Person>GetPersons(){varlstRes=newList<Person>();for(vari=0;i<50000;i++){varoPerson=newPerson();oPerson.Name="李雷"+i;oPerson.Age=20;< |