测试数据使用的是项目中的真实数据,每条数据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以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)