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比较强。

转载于:https://www.cnblogs.com/johnblogs/p/9679226.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值