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

  • 相关阅读:
    MIX11大会WP7主题演讲中文字幕版
    日本战神——源义经
    System.Web.HttpUtility for .Net Compact Framework
    VS2010 SP1
    <如何成为一个成功的职业经理人>读书笔记2
    <左手曾国藩,右手胡雪岩>读书笔记
    <福布斯荐75本经商必读06基业长青>读书笔记
    <中国人聪明之道>读书笔记
    <浮沉>读书笔记
    <79个潜规则:改变生活的心理学法则>读书笔记
  • 原文地址:https://www.cnblogs.com/johnblogs/p/9679226.html
Copyright © 2020-2023  润新知