C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比

C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比,第1张

概述测试数据使用的是项目中的真实数据,每条数据28个字段,数据量126215条数据 测试数据库Oracle 11g 测试电脑性能:ThinkPad T490,CPU是i5-8265U,全核睿频约3.2GH

测试数据使用的是项目中的真实数据,每条数据28个字段,数据量126215条数据

测试数据库Oracle 11g

测试电脑性能:ThinkPad T490,cpu是i5-8265U,全核睿频约3.2GHz,单核睿频3.7GHz,硬盘是500G固态硬盘

实体类代码:

BusinessEntity代码:

using System; System.Collections.Generic; System.linq; System.Runtime.Serialization; System.Text; System.Threading.Tasks;namespace Models{    [Serializable]    [DataContract(IsReference = true,namespace = "http://www.suncreate.net/2014/combatplatform")]    public abstract class BusinessEntity    {        protected BusinessEntity(string platformname) { }        [DataMember]        virtual string Platformname { get; set; }    }}
VIEw Code

PtCameraInfo代码:

 System.ComponentModel; Utils;truepartial  PtCameraInfo : BusinessEntity,INotifyPropertyChanging,INotifyPropertyChanged    {        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(System.String.Empty);         _ID;         _CAMERA_NO;         _GBNO;         _CAMERA_name;        private System.Nullable<decimal> _ORG_ID;         _LONGITUDE;         _LATITUDE;         _CAMERA_DIRECTION;         _CAMERA_TYPE;         _CAMERA_STATE;         _IS_HAVE_CONSolE;         _SHORT_MSG;         _IS_WIFI;        int _BuildPeriod;         _KeyUnit;         _Street;         _CAMERA_FUN_TYPE;         _import_WATCH;         _ANALYSIS_NO;         _Camera_Ip;         _PLATFORM_PRODUCT_ID;        int? _RECODE_SAVE_TYPE;         _CAMERA_BELONGS_ID;         _CAMERA_BELONGS_PK;         _position_TYPE;        private DateTime _MODIFY_TIME;         _IS_DEL;         _Monitor_Type;        #region Extensibility Method DeFinitions        voID OnCreated();        #endregion        new const string Platformname = CameraInfo;        public PtCameraInfo( strPlatformname)            : base(strPlatformname)        {            OnCreated();        }        public PtCameraInfo()            : (Platformname)        {            OnCreated();        }        /// <summary>        /// There are no comments for ID in the schema.        </summary>        [DataMember(Order = 1)]         ID        {            get            {                return this._ID;            }            if (this._ID != value)                {                    .SendPropertyChanging();                    this._ID = value;                    this.SendPropertyChanged(ID);                }            }        }         There are no comments for CAMERA_NO in the schema.        2 CAMERA_NO        {            ._CAMERA_NO;            }            this._CAMERA_NO !=this._CAMERA_NO =CAMERA_NO There are no comments for CAMERA_name in the schema.        3 CAMERA_name        {            ._CAMERA_name;            }            this._CAMERA_name !=this._CAMERA_name =CAMERA_name There are no comments for ORG_ID in the schema.        4virtual System.Nullable< ORG_ID        {            ._ORG_ID;            }            this._ORG_ID !=this._ORG_ID =ORG_ID There are no comments for LONGITUDE in the schema.        5 LONGITUDE        {            ._LONGITUDE;            }            this._LONGITUDE !=this._LONGITUDE =LONGITUDE There are no comments for LATITUDE in the schema.        6 LATITUDE        {            ._LATITUDE;            }            this._LATITUDE !=this._LATITUDE =LATITUDE There are no comments for CAMERA_DIRECTION in the schema.        7 CAMERA_DIRECTION        {            ._CAMERA_DIRECTION;            }            this._CAMERA_DIRECTION !=this._CAMERA_DIRECTION =CAMERA_DIRECTION There are no comments for CAMERA_TYPE in the schema.        8 CAMERA_TYPE        {            ._CAMERA_TYPE;            }            this._CAMERA_TYPE !=this._CAMERA_TYPE =CAMERA_TYPE There are no comments for CAMERA_STATE in the schema.        9 CAMERA_STATE        {            ._CAMERA_STATE;            }            this._CAMERA_STATE !=this._CAMERA_STATE =CAMERA_STATE);                    //this.SendPropertyChanged(this);                }            }        }         There are no comments for IS_HAVE_CONSolE in the schema.        10 IS_HAVE_CONSolE        {            ._IS_HAVE_CONSolE;            }            this._IS_HAVE_CONSolE !=this._IS_HAVE_CONSolE =IS_HAVE_CONSolE);                }            }        }        [DataMember(Order = 11 SHORT_MSG        {            ._SHORT_MSG;            }            this._SHORT_MSG !=this._SHORT_MSG =SHORT_MSG 设备ip        12 Camera_Ip        {            ._Camera_Ip;            }            this._Camera_Ip !=this._Camera_Ip =Camera_Ip WIFI探针        13 IS_WIFI        {            ._IS_WIFI;            }            this._IS_WIFI !=this._IS_WIFI =IS_WIFI 0全部 1天网 2雪亮 6支网        14 BuildPeriod        {            ._BuildPeriod;            }            this._BuildPeriod !=this._BuildPeriod =BuildPeriod 重点单位        15 KeyUnit        {            ._KeyUnit;            }            this._KeyUnit !=this._KeyUnit =KeyUnit 重点街道        16 Street        {            ._Street;            }            this._Street !=this._Street =Street 1、 车辆卡口; 2、 人员卡口;3、 微卡口;4、WIFI采集;5、综合治理q;6、 综合治理球; 7、人脸摄像机(后智能);8、虚拟卡口;9、高点监控(球);10、高点监控(q);11、视频结构化(后智能);99、其他。可以多选,各参数以“ /” 分隔(天网:CAMERA_USE)        17 CAMERA_FUN_TYPE        {            ._CAMERA_FUN_TYPE;            }            this._CAMERA_FUN_TYPE !=this._CAMERA_FUN_TYPE =CAMERA_FUN_TYPE 1、第一道防控圈;2、第二道防控圈;3、第三道防空圈;4、第四道防控圈;5、第五道防控圈;6、第六道防控圈;99、其他(天网:重点监控对象)        18 import_WATCH        {            ._import_WATCH;            }            this._import_WATCH !=this._import_WATCH =import_WATCH 解析编码        19 ANALYSIS_NO        {            ._ANALYSIS_NO;            }            this._ANALYSIS_NO !=this._ANALYSIS_NO =ANALYSIS_NO 国标编码        20 GBNO        {            ._GBNO;            }            this._GBNO !=this._GBNO =GBNO 相机产品编号        21 PLATFORM_PRODUCT_ID        {            ._PLATFORM_PRODUCT_ID;            }            this._PLATFORM_PRODUCT_ID !=this._PLATFORM_PRODUCT_ID =PLATFORM_PRODUCT_ID22 RECODE_SAVE_TYPE        {            ._RECODE_SAVE_TYPE;            }            this._RECODE_SAVE_TYPE !=this._RECODE_SAVE_TYPE =RECODE_SAVE_TYPE 实卡编码        23 CAMERA_BELONGS_ID        {            ._CAMERA_BELONGS_ID;            }            this._CAMERA_BELONGS_ID !=this._CAMERA_BELONGS_ID =CAMERA_BELONGS_ID 虚卡编码        24 CAMERA_BELONGS_PK        {            ._CAMERA_BELONGS_PK;            }            this._CAMERA_BELONGS_PK !=this._CAMERA_BELONGS_PK =CAMERA_BELONGS_PK 位置类型        25 position_TYPE        {            ._position_TYPE;            }            this._position_TYPE !=this._position_TYPE =position_TYPE 时间戳        26virtual DateTime MODIFY_TIME        {            ._MODIFY_TIME;            }            this._MODIFY_TIME !=this._MODIFY_TIME =MODIFY_TIME 是否删除        27 IS_DEL        {            ._IS_DEL;            }            this._IS_DEL !=this._IS_DEL =IS_DEL 监控点位类型        28 Monitor_Type        {            ._Monitor_Type;            }            this._Monitor_Type !=this._Monitor_Type =Monitor_Type);                }            }        }        event PropertyChangingEventHandler PropertyChanging;         PropertyChangedEventHandler PropertyChanged;        protected  SendPropertyChanging()        {            var handler = .PropertyChanging;            if (handler != null)                handler(,emptyChangingEventArgs);        }         SendPropertyChanging(System.String propertyname)        {            this, PropertyChangingEventArgs(propertyname));        }         SendPropertyChanged(System.String propertyname)        {            .PropertyChanged;             PropertyChangedEventArgs(propertyname));        }        overrIDe  ToString()        {            StringBuilder sb =  StringBuilder();            sb.Append(this.ID + }{);            sb.Append(this.CAMERA_NO + this.GBNO + this.CAMERA_name + this.ORG_ID + this.LONGITUDE + this.LATITUDE + this.CAMERA_DIRECTION + this.CAMERA_TYPE + this.CAMERA_STATE + this.IS_HAVE_CONSolE + this.SHORT_MSG + this.IS_WIFI + this.BuildPeriod + this.KeyUnit + this.Street + this.CAMERA_FUN_TYPE + this.import_WATCH + this.ANALYSIS_NO + this.Camera_Ip + this.PLATFORM_PRODUCT_ID + this.RECODE_SAVE_TYPE + this.CAMERA_BELONGS_ID + this.CAMERA_BELONGS_PK + this.position_TYPE + this.MODIFY_TIME + this.IS_DEL + this.Monitor_Type + );            return sb.ToString();        }        static PtCameraInfo FromString( value)        {            PtCameraInfo info =  PtCameraInfo();            string[] strArr = value.Split(string[] {  },StringSplitoptions.None);            info.ID = strArr[0];            info.CAMERA_NO = strArr[];            info.GBNO = strArr[];            info.CAMERA_name = strArr[];            info.ORG_ID = StringUtil.ConvertToDecimal(strArr[]);            info.LONGITUDE = strArr[];            info.LATITUDE = strArr[];            info.CAMERA_DIRECTION = strArr[];            info.CAMERA_TYPE = StringUtil.ConvertToDecimal(strArr[]);            info.CAMERA_STATE = strArr[];            info.IS_HAVE_CONSolE = StringUtil.ConvertToDecimal(strArr[]);            info.SHORT_MSG = strArr[];            info.IS_WIFI = strArr[];            info.BuildPeriod = StringUtil.ConvertToInt32(strArr[]);            info.KeyUnit = StringUtil.ConvertToInt32(strArr[]);            info.Street = strArr[];            info.CAMERA_FUN_TYPE = StringUtil.ConvertToInt32(strArr[]);            info.import_WATCH = StringUtil.ConvertToInt32(strArr[]);            info.ANALYSIS_NO = strArr[];            info.Camera_Ip = strArr[];            info.PLATFORM_PRODUCT_ID = strArr[];            info.RECODE_SAVE_TYPE = StringUtil.ConvertToInt32(strArr[]);            info.CAMERA_BELONGS_ID = strArr[];            info.CAMERA_BELONGS_PK = strArr[];            info.position_TYPE = strArr[];            info.MODIFY_TIME = StringUtil.ConvertToDateTime(strArr[]).Value;            info.IS_DEL = Convert.ToInt32(strArr[]);            info.Monitor_Type = strArr[];             info;        }    }}
VIEw Code

 

自写简单序列化方法部分代码:

序列化:

using (fileStream fs =  fileStream(path,fileMode.OpenorCreate,fileAccess.Write)){    fs.SetLength();    using (StreamWriter sw =  StreamWriter(fs))    {        StringBuilder str =  StringBuilder();        foreach (PtCameraInfo item in value)        {            str.Append(item.ToString() + ][);        }        sw.Write(str);    }    fs.Close();}
VIEw Code

反序列化:

using (StreamReader sr =  StreamReader(fs))    {        LogUtil.Log(自写序列化后文件大小:" + (fs.Length / 1024.0 / 1024.0).ToString(0.000" + M));        string str = sr.ReadToEnd();        string[] modelArr = str.Split(new List<Models.PtCameraInfo>();        foreach (string modelStr  modelArr)        {            PtCameraInfo info = PtCameraInfo.FromString(modelStr);            result.Add(info);        }         result;    }}
VIEw Code

PtCameraInfo类的ToString和FromString方法:

 ToString(){    StringBuilder sb =  StringBuilder();    sb.Append();    sb.Append( sb.ToString();} value){    PtCameraInfo info =  PtCameraInfo();    ];    info.CAMERA_NO = strArr[];    info.GBNO = strArr[];    info.CAMERA_name = strArr[];    info.ORG_ID = StringUtil.ConvertToDecimal(strArr[]);    info.LONGITUDE = strArr[];    info.LATITUDE = strArr[];    info.CAMERA_DIRECTION = strArr[];    info.CAMERA_TYPE = StringUtil.ConvertToDecimal(strArr[]);    info.CAMERA_STATE = strArr[];    info.IS_HAVE_CONSolE = StringUtil.ConvertToDecimal(strArr[]);    info.SHORT_MSG = strArr[];    info.IS_WIFI = strArr[];    info.BuildPeriod = StringUtil.ConvertToInt32(strArr[]);    info.KeyUnit = StringUtil.ConvertToInt32(strArr[]);    info.Street = strArr[];    info.CAMERA_FUN_TYPE = StringUtil.ConvertToInt32(strArr[]);    info.import_WATCH = StringUtil.ConvertToInt32(strArr[]);    info.ANALYSIS_NO = strArr[];    info.Camera_Ip = strArr[];    info.PLATFORM_PRODUCT_ID = strArr[];    info.RECODE_SAVE_TYPE = StringUtil.ConvertToInt32(strArr[]);    info.CAMERA_BELONGS_ID = strArr[];    info.CAMERA_BELONGS_PK = strArr[];    info.position_TYPE = strArr[];    info.MODIFY_TIME = StringUtil.ConvertToDateTime(strArr[]).Value;    info.IS_DEL = Convert.ToInt32(strArr[]);    info.Monitor_Type = strArr[];     info;}
VIEw Code

 

 测试代码:

 TestSerialize(){    Task.Factory.StartNew(() =>    {        try        {            Log(开始);            LogUtil.Log();            string sql = select * from PT_CAMERA_INFO;            string connStr = Data Source=(DESCRIPTION =(ADDRESS_List =(ADDRESS = (PROTOCol = TCP)(HOST = localhost)(PORT = 1521)))(CONNECT_DATA =(SERVICE_name = orcl)));Persist Security Info=True;User ID=shiny;Password=shiny;;            Datatable dt =  Datatable();            using (OracleConnection conn =  OracleConnection(connStr))            {                conn.open();                OracleDataAdapter command =  OracleDataAdapter(sql,conn);                command.Fill(dt);            }            LogUtil.Log(数据量:" + dt.Rows.Count);            int n = dt.Rows.Count;            List<PtCameraInfo> List = new List<PtCameraInfo>();            for (int i = 0; i < n; i++)            {                DaTarow daTarow = dt.Rows[i];                PtCameraInfo info =  PtCameraInfo();                info.ID = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_NO = StringUtil.ConvertToString(daTarow[]);                info.GBNO = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_name = StringUtil.ConvertToString(daTarow[]);                info.ORG_ID = StringUtil.ConvertToDecimal(daTarow[]);                info.LONGITUDE = StringUtil.ConvertToString(daTarow[]);                info.LATITUDE = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_DIRECTION = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_TYPE = StringUtil.ConvertToDecimal(daTarow[]);                info.CAMERA_STATE = StringUtil.ConvertToString(daTarow[]);                info.IS_HAVE_CONSolE = StringUtil.ConvertToDecimal(daTarow[]);                info.SHORT_MSG = StringUtil.ConvertToString(daTarow[]);                info.IS_WIFI = StringUtil.ConvertToString(daTarow[]);                info.BuildPeriod = StringUtil.ConvertToInt32_2(daTarow[]);                info.KeyUnit = StringUtil.ConvertToInt32_2(daTarow[]);                info.Street = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_FUN_TYPE = StringUtil.ConvertToInt32_2(daTarow[]);                info.import_WATCH = StringUtil.ConvertToInt32_2(daTarow[]);                info.ANALYSIS_NO = StringUtil.ConvertToString(daTarow[]);                info.Camera_Ip = StringUtil.ConvertToString(daTarow[]);                info.PLATFORM_PRODUCT_ID = StringUtil.ConvertToString(daTarow[]);                info.RECODE_SAVE_TYPE = StringUtil.ConvertToInt32(daTarow[]);                info.CAMERA_BELONGS_ID = StringUtil.ConvertToString(daTarow[]);                info.CAMERA_BELONGS_PK = StringUtil.ConvertToString(daTarow[]);                info.position_TYPE = StringUtil.ConvertToString(daTarow[]);                info.MODIFY_TIME = StringUtil.ConvertToDateTime(daTarow[25]) == null ? DateTime.MinValue : StringUtil.ConvertToDateTime(daTarow[]).Value;                info.IS_DEL = StringUtil.ConvertToInt32_2(daTarow[]);                info.Monitor_Type = StringUtil.ConvertToString(daTarow[]);                List.Add(info);            }            LogTimeUtil logTimeUtil =  LogTimeUtil();            fileCacheUtil.SetValue(List1BinaryFormatter写List1);            LogTimeUtil logTimeUtil2 =  LogTimeUtil();            fileCacheUtil2.SetValue(List2ProtoBuf写List2);            LogTimeUtil logTimeUtil3 =  LogTimeUtil();            fileCacheUtil3.SetValue(List3Newtonsoft.Json写List3);            LogTimeUtil logTimeUtil4 =  LogTimeUtil();            fileCacheUtil4.SetValue(List4自写序列化方法写List4);            LogTimeUtil logTimeUtil5 =  LogTimeUtil();            List<PtCameraInfo> result1 = (List<PtCameraInfo>)fileCacheUtil.GetValue();            logTimeUtil5.LogTime(BinaryFormatter读List1);            LogTimeUtil logTimeUtil6 =  LogTimeUtil();            List<PtCameraInfo> result2 = fileCacheUtil2.GetValue<List<PtCameraInfo>>();            logTimeUtil6.LogTime(ProtoBuf读List2);            LogTimeUtil logTimeUtil7 =  LogTimeUtil();            List<PtCameraInfo> result3 = (List<PtCameraInfo>)fileCacheUtil3.GetValue();            logTimeUtil7.LogTime(Newtonsoft.Json读List3);            LogTimeUtil logTimeUtil8 =  LogTimeUtil();            List<PtCameraInfo> result4 = fileCacheUtil4.GetValue();            logTimeUtil8.LogTime(自写序列化方法读List4);            LogUtil.Log(结束);            Log();        }        catch (Exception ex)        {            Log(错误:" + ex.Message + \r\n ex.StackTrace);        }    });}
VIEw Code

fileCacheUtil.cs代码:

 System.IO; System.Security.Cryptography; System.Threading.Tasks; System.Runtime.Serialization.Formatters.Binary; System.Threading; System.Reflection; Utils{    <summary>     缓存工具类     缓存数据存储在文件中    </summary>    static  fileCacheUtil    {        #region 变量        </summary>        object _lock = objectstatic BinaryFormatter formatter =  BinaryFormatter();         _folderPath;        #region 静态构造函数        static fileCacheUtil()        {            UriBuilder uri =  UriBuilder(Assembly.GetExecutingAssembly().CodeBase);            _folderPath = Path.GetDirectoryname(Uri.UnescapeDataString(uri.Path)) + \cache;        }        #region SetValue 保存键值对         保存键值对        voID SetValue(string key,1)">object value,1)">string dependentKey = null,1)">int expirationMinutes = )        {                        {                DateTime dt = DateTime.Now;                CacheData data =  CacheData(key,value);                data.updateTime = DateTime.Now;                data.expirationMinutes = expirationMinutes;                data.dependentKey = dependentKey;                if (!Directory.Exists(_folderPath))                {                    Directory.CreateDirectory(_folderPath);                }                string keyMd5 = GetMD5(key);                string path = _folderPath + \" + keyMd5 + .txt;                lock (_lock)                {                    );                        formatter.Serialize(fs,data);                        fs.Close();                    }                }                LogUtil.Log("fileCacheUtil写缓存" + key + "花费时间" + DateTime.Now.Subtract(dt).TotalSeconds.ToString() + "秒");            }             (Exception ex)            {                LogUtil.Error(ex,fileCacheUtil写缓存错误);            }        }        #region GetValue 获取键值对         获取键值对        object GetValue( key)        {             DateTime.Now;                if (file.Exists(path))                    {                        BinaryFormatter序列化后文件大小:"+));                            CacheData data = (CacheData)formatter.Deserialize(fs);                            fs.Close();                            if (data.expirationMinutes > 0 && DateTime.Now.Subtract(data.updateTime).TotalMinutes > data.expirationMinutes)                            {                                file.Delete(path);                                ;                            }                            if (data.dependentKey != )                            {                                string dependentPath = _folderPath + " + GetMD5(data.dependentKey) + ;                                 (file.Exists(dependentPath))                                {                                    fileInfo fileInfo =  fileInfo(dependentPath);                                    if (fileInfo.LastWriteTime > data.updateTime)                                    {                                        file.Delete(path);                                        ;                                    }                                }                            }                            LogUtil.Log("fileCacheUtil读缓存" + key + "花费时间" + DateTime.Now.Subtract(dt).TotalSeconds.ToString() + "秒");                             data.value;                        }                    }                }                ;            }            fileCacheUtil读缓存错误);                ;            }        }        #region Delete 删除         删除        voID Delete( GetMD5(key);             (_lock)            {                file.Delete(path);            }        }        #region Deleteall 全部删除         全部删除         Deleteall()        {            string[] files = Directory.Getfiles(_folderPath);             (_lock)            {                string file  files)                {                    file.Delete(file);                }            }        }        #region 计算MD5值         计算MD5值        string GetMD5( value)        {             value;            string base64 = Convert.ToBase64String(ASCIIEnCoding.ASCII.GetBytes(value)).Replace(/",-if (base64.Length > 200)            {                MD5CryptoServiceProvIDer md5 =  MD5CryptoServiceProvIDer();                byte[] barr = md5.ComputeHash(ASCIIEnCoding.ASCII.GetBytes(value));                StringBuilder sb =  StringBuilder();                byte b  barr)                {                    sb.Append(b.ToString(x2));                }                 sb.ToString();            }             base64;        }        #endregion    }    #region CacheData 缓存数据     缓存数据    </summary>    [Serializable]     CacheData    {        string key { ; }        object value {  缓存更新时间        public DateTime updateTime {  过期时间(分钟),0表示永不过期        double expirationMinutes {  缓存依赖键        string dependentKey { ; }        public CacheData(this.key = key;            this.value = value;        }    }    }
VIEw Code

 fileCacheUtil2.cs代码:

 ProtoBuf; System.Reflection; fileCacheUtil2    {         fileCacheUtil2()        {            UriBuilder uri = voID SetValue<T>(int expirationSecond =  DateTime.Now;                CacheData2<T> data = new CacheData2<T>(key,1)"> DateTime.Now;                data.expirationSecond = expirationSecond;                data.dependentKey =);                        Serializer.Serialize<CacheData2<T>>(fs,1)">static T GetValue<T>(ProtoBuf序列化后文件大小:));                            CacheData2<T> data = (CacheData2<T>)Serializer.Deserialize<CacheData2<T>>(fs);                            fs.Close();                            if (data.expirationSecond > 0 && DateTime.Now.Subtract(data.updateTime).TotalSeconds > data.expirationSecond)                            {                                file.Delete(path);                                default(T);                            }                            (T);                                    }                                }                            }                            (T);            }            (T);            }        }            }    #region CacheData2 缓存数据        [Serializable]    [ProtoContract]    class CacheData2<T>    {        </summary>        [ProtoMember(public T value {  过期时间(秒),0表示永不过期        int expirationSecond {  CacheData2()        {        }        public CacheData2( key,T value)        {            }
VIEw Code

 fileCacheUtil3.cs代码:

 Newtonsoft.Json; Models; fileCacheUtil3    {         fileCacheUtil3()        {            UriBuilder uri = );                         StreamWriter(fs))                        {                            sw.Write(JsonConvert.SerializeObject(data));                        }                        fs.Close();                    }                }                LogUtil.Log("fileCacheUtil写缓存" + key + "花费时间" + DateTime.Now.Subtract(dt).TotalSeconds.ToString() + "秒"); StreamReader(fs))                            {                                LogUtil.Log(Newtonsoft.Json序列化后文件大小:));                                CacheData data = JsonConvert.DeserializeObject<CacheData>(sr.ReadToEnd());                                fs.Close();                                 data.expirationMinutes)                                {                                    file.Delete(path);                                    ;                                }                                )                                {                                    ;                                     (file.Exists(dependentPath))                                    {                                        fileInfo fileInfo =  fileInfo(dependentPath);                                         data.updateTime)                                        {                                            file.Delete(path);                                            ;                                        }                                    }                                }                                LogUtil.Log("fileCacheUtil读缓存" + key + "花费时间" + DateTime.Now.Subtract(dt).TotalSeconds.ToString() + "秒");                                return JsonConvert.DeserializeObject<List<PtCameraInfo>>(data.value.ToString());                            }                        }                    }                }                 CacheData3    {        int expirationMinutes { public CacheData3(}
VIEw Code

 fileCacheUtil4.cs代码:

 fileCacheUtil4    {         fileCacheUtil4()        {            UriBuilder uri =  DateTime.Now;                 StreamWriter(fs))                        {                            StringBuilder str =  StringBuilder();                             value)                            {                                str.Append(item.ToString() + );                            }                            sw.Write(str);                        }                        fs.Close();                    }                }                static List<PtCameraInfo> GetValue());                                 sr.ReadToEnd();                                ();                                 modelArr)                                {                                    PtCameraInfo info = PtCameraInfo.FromString(modelStr);                                    result.Add(info);                                }                                 result;                            }                        }                    }                }                    }}
VIEw Code

 

测试结果如下图:

 

测试结果整理后:

 

结论:

1、这几个工具中,protobuf-net序列化和反序列化效率是最快的

2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多

3、Newtonsoft.Json序列化后的文件体积比较大

4、Newtonsoft.Json在序列化反序列化过程中消耗内存较多(上图未体现,实际测试中内存占用多)

5、不出我所料,自己写的简单序列化反序列化方法也很快,为什么自己写的也很快呢?是因为使用的是最笨的方法,直接赋值,没有使用反射

6、自写序列化方法生成的文件体积也比较小,因为除了分隔符和数据内容之外,没有多余的东西,虽然分隔符很短,但是大量重复的分隔符也会占用一定的空间,所以自写的序列化方法生成的文件体积比protobuf-net要大

7、protobuf-net比BinaryFormatter反序列化快了将近一个数量级,很有实用价值

 

总结

以上是内存溢出为你收集整理的C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比全部内容,希望文章能够帮你解决C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存