微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

测试数据使用的是项目中的真实数据,每条数据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、综合治理枪;6、 综合治理球; 7、人脸摄像机(后智能);8、虚拟卡口;9、高点监控(球);10、高点监控(枪);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反序列化快了将近一个数量级,很有实用价值

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐