c#基础系列:序列化效率比拼——谁是最后的赢家Newtonsoft.Json
2017-04-09 10:21
411 查看
前言:作为开发人员,对象的序列化恐怕难以避免。楼主也是很早以前就接触过序列化,可是理解都不太深刻,对于用哪种方式去做序列化更是随波逐流——项目中原来用的什么方式照着用就好了。可是这么多年自己对于这东西还是挺模糊的,今天正好有时间,就将原来用过的几种方式总结了下,也算是做一个记录,顺便做了下性能测试。楼主算了下,从使用序列化到现在,用到的无非下面几种方式:(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安装这个包。方式如下:
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比较强。
以上只是楼主自己做的简单测试,可能存在不够严谨的地方,望各位大虾拍砖指正~~
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安装这个包。方式如下:
public static List<Person> GetPersons() { var lstRes = new List<Person>(); for (var i = 0; i < 50000; i++) { var oPerson = new Person(); oPerson.Name = "李雷" + i; oPerson.Age = 20; oPerson.IsChild = i % 5 == 0 ? true : false; oPerson.Test1 = "aaaaaa"; oPerson.Test2 = i.ToString() ; oPerson.Test3 = i.ToString(); oPerson.Test4 = i.ToString(); oPerson.Test5 = i.ToString(); oPerson.Test6 = i.ToString(); oPerson.Test7 = i.ToString(); oPerson.Test8 = i.ToString(); oPerson.Test9 = i.ToString(); oPerson.Test10 = i.ToString(); lstRes.Add(oPerson); } return lstRes; } public static DataTable GetDataTable() { var dt = new DataTable("dt"); dt.Columns.Add("Age", Type.GetType("System.Int32")); dt.Columns.Add("Name", Type.GetType("System.String")); dt.Columns.Add("Sex", Type.GetType("System.String")); dt.Columns.Add("IsChild", Type.GetType("System.Boolean")); for (var i = 0; i < 1000; i++) { DataRow dr = dt.NewRow(); dr["Age"] = i + 1; dr["Name"] = "Name" + i; dr["Sex"] = i % 2 == 0 ? "男" : "女"; dr["IsChild"] = i % 5 > 0 ? true : false; dt.Rows.Add(dr); } return dt; }
static void Main(string[] args) { #region 强类型对象 var lstRes = GetPersons(); #region JavaScriptSerializer序列化方式 var lstScriptSerializeObj = new List<string>(); Stopwatch sp_script = new Stopwatch(); sp_script.Start(); foreach (var oPerson in lstRes) { lstScriptSerializeObj.Add(oPerson.ToScriptJsonString<Person>()); } sp_script.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp_script1 = new Stopwatch(); sp_script1.Start(); foreach (var oFrameSerializeObj in lstScriptSerializeObj) { lstRes.Add(oFrameSerializeObj.ToScriptJsonObject<Person>()); } sp_script1.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式反序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script1.ElapsedMilliseconds + "毫秒"); #endregion #region DataContract序列化方式 var lstFrameSerializeObj = new List<string>(); Stopwatch sp = new Stopwatch(); sp.Start(); foreach (var oPerson in lstRes) { lstFrameSerializeObj.Add(oPerson.ToJsonString<Person>()); } sp.Stop(); Console.WriteLine("DataContract序列化方式序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp1 = new Stopwatch(); sp1.Start(); foreach (var oFrameSerializeObj in lstFrameSerializeObj) { lstRes.Add(oFrameSerializeObj.ToJsonObject<Person>()); } sp1.Stop(); Console.WriteLine("DataContract序列化方式反序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp1.ElapsedMilliseconds + "毫秒"); #endregion #region Newtonsoft var lstNewtonsoftSerialize = new List<string>(); Stopwatch sp2 = new Stopwatch(); sp2.Start(); foreach (var oPerson in lstRes) { lstNewtonsoftSerialize.Add(JsonConvert.SerializeObject(oPerson)); } sp2.Stop(); Console.WriteLine("Newtonsoft.Json方式序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp2.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp3 = new Stopwatch(); sp3.Start(); foreach (var oNewtonsoft in lstNewtonsoftSerialize) { lstRes.Add(JsonConvert.DeserializeObject<Person>(oNewtonsoft)); } sp3.Stop(); Console.WriteLine("Newtonsoft.Json方式反序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp3.ElapsedMilliseconds + "毫秒"); #endregion #endregion #region 弱类型DataTable /*var dt = GetDataTable(); #region JavaScriptSerializer序列化方式 var lstScriptSerializeObj = new List<string>(); Stopwatch sp_script = new Stopwatch(); sp_script.Start(); var strRes = dt.ToScriptJsonString<DataTable>(); sp_script.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp_script1 = new Stopwatch(); sp_script1.Start(); dt = strRes.ToScriptJsonObject<DataTable>(); sp_script1.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式反序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script1.ElapsedMilliseconds + "毫秒"); #endregion #region DataContract序列化方式 var lstFrameSerializeObj = new List<string>(); Stopwatch sp = new Stopwatch(); sp.Start(); strRes = dt.ToJsonString<DataTable>(); sp.Stop(); Console.WriteLine("DataContract序列化方式序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp1 = new Stopwatch(); sp1.Start(); dt = strRes.ToJsonObject<DataTable>(); sp1.Stop(); Console.WriteLine("DataContract序列化方式反序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp1.ElapsedMilliseconds + "毫秒"); #endregion #region Newtonsoft var lstNewtonsoftSerialize = new List<string>(); Stopwatch sp2 = new Stopwatch(); sp2.Start(); strRes = JsonConvert.SerializeObject(dt); sp2.Stop(); Console.WriteLine("Newtonsoft.Json方式序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp2.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp3 = new Stopwatch(); sp3.Start(); dt = JsonConvert.DeserializeObject<DataTable>(strRes); sp3.Stop(); Console.WriteLine("Newtonsoft.Json方式反序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp3.ElapsedMilliseconds + "毫秒"); #endregion*/ #endregion Console.ReadLine(); }
static void Main(string[] args) { #region 强类型对象 var lstRes = GetPersons(); #region JavaScriptSerializer序列化方式 var lstScriptSerializeObj = new List<string>(); Stopwatch sp_script = new Stopwatch(); sp_script.Start(); foreach (var oPerson in lstRes) { lstScriptSerializeObj.Add(oPerson.ToScriptJsonString<Person>()); } sp_script.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp_script1 = new Stopwatch(); sp_script1.Start(); foreach (var oFrameSerializeObj in lstScriptSerializeObj) { lstRes.Add(oFrameSerializeObj.ToScriptJsonObject<Person>()); } sp_script1.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式反序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script1.ElapsedMilliseconds + "毫秒"); #endregion #region DataContract序列化方式 var lstFrameSerializeObj = new List<string>(); Stopwatch sp = new Stopwatch(); sp.Start(); foreach (var oPerson in lstRes) { lstFrameSerializeObj.Add(oPerson.ToJsonString<Person>()); } sp.Stop(); Console.WriteLine("DataContract序列化方式序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp1 = new Stopwatch(); sp1.Start(); foreach (var oFrameSerializeObj in lstFrameSerializeObj) { lstRes.Add(oFrameSerializeObj.ToJsonObject<Person>()); } sp1.Stop(); Console.WriteLine("DataContract序列化方式反序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp1.ElapsedMilliseconds + "毫秒"); #endregion #region Newtonsoft var lstNewtonsoftSerialize = new List<string>(); Stopwatch sp2 = new Stopwatch(); sp2.Start(); foreach (var oPerson in lstRes) { lstNewtonsoftSerialize.Add(JsonConvert.SerializeObject(oPerson)); } sp2.Stop(); Console.WriteLine("Newtonsoft.Json方式序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp2.ElapsedMilliseconds + "毫秒"); lstRes.Clear(); Stopwatch sp3 = new Stopwatch(); sp3.Start(); foreach (var oNewtonsoft in lstNewtonsoftSerialize) { lstRes.Add(JsonConvert.DeserializeObject<Person>(oNewtonsoft)); } sp3.Stop(); Console.WriteLine("Newtonsoft.Json方式反序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp3.ElapsedMilliseconds + "毫秒"); #endregion #endregion #region 弱类型DataTable /*var dt = GetDataTable(); #region JavaScriptSerializer序列化方式 var lstScriptSerializeObj = new List<string>(); Stopwatch sp_script = new Stopwatch(); sp_script.Start(); var strRes = dt.ToScriptJsonString<DataTable>(); sp_script.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp_script1 = new Stopwatch(); sp_script1.Start(); dt = strRes.ToScriptJsonObject<DataTable>(); sp_script1.Stop(); Console.WriteLine("JavaScriptSerializer序列化方式反序列化" + lstScriptSerializeObj.Count + "个对象耗时:" + sp_script1.ElapsedMilliseconds + "毫秒"); #endregion #region DataContract序列化方式 var lstFrameSerializeObj = new List<string>(); Stopwatch sp = new Stopwatch(); sp.Start(); strRes = dt.ToJsonString<DataTable>(); sp.Stop(); Console.WriteLine("DataContract序列化方式序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp1 = new Stopwatch(); sp1.Start(); dt = strRes.ToJsonObject<DataTable>(); sp1.Stop(); Console.WriteLine("DataContract序列化方式反序列化" + lstFrameSerializeObj.Count + "个对象耗时:" + sp1.ElapsedMilliseconds + "毫秒"); #endregion #region Newtonsoft var lstNewtonsoftSerialize = new List<string>(); Stopwatch sp2 = new Stopwatch(); sp2.Start(); strRes = JsonConvert.SerializeObject(dt); sp2.Stop(); Console.WriteLine("Newtonsoft.Json方式序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp2.ElapsedMilliseconds + "毫秒"); dt.Clear(); Stopwatch sp3 = new Stopwatch(); sp3.Start(); dt = JsonConvert.DeserializeObject<DataTable>(strRes); sp3.Stop(); Console.WriteLine("Newtonsoft.Json方式反序列化" + lstNewtonsoftSerialize.Count + "个对象耗时:" + sp3.ElapsedMilliseconds + "毫秒"); #endregion*/ #endregion Console.ReadLine(); }
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比较强。
以上只是楼主自己做的简单测试,可能存在不够严谨的地方,望各位大虾拍砖指正~~
相关文章推荐
- 序列化效率比拼——谁是最后的赢家Newtonsoft.Json
- 序列化效率比拼——谁是最后的赢家Newtonsoft.Json
- C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll
- C# 使用Newtonsoft.Json序列化自定义类型
- [C# 基础知识系列]专题三:C#中为什么序列化,如何序列化
- C#使用NewtonSoft进行Json序列化,设置字段首字母小写方法
- C# Newtonsoft.Json JsonSerializerSettings 全局序列化设置
- c# 使用 Newtonsoft.Json 序列化json字符串以及,反序列化对象
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
- C#基础知识梳理系列十四:序列化
- C# 利用Newtonsoft.Json进行Json序列化与反序列化
- C# Json序列化工具--Newtonsoft.Json简介和使用
- C# Newtonsoft.Json JsonSerializerSettings配置序列化操作
- C#基础知识梳理系列十四:序列化
- C# JSon序列化工具 - Newtonsoft.Json简介和使用
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
- Newtonsoft.Json序列化反序列化基础
- C# .NET利用Newtonsoft.Json来序列化和反序列化对象
- C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)
- C#强化系列文章一:ViewState使用兼谈序列化