惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
小众软件
小众软件
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
博客园_首页
T
Tailwind CSS Blog
The Cloudflare Blog
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
D
Docker
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - UnseenstoneX

《打砖块创作家》隐私政策 打砖块创作家《小游戏隐私保护指引》 python 常用数据结构 Python 基本语法 地形遇到几个问题 TArray数组 UE问题分部解决 UE寻找Actor UE对话框 ShadowCaster 代码 C#读写csv文件 优化相关 unity 打开文件夹并鼠标选中某文件 Json解析 C# winform中 选择文件和保存文件 Unity与Android交互实现 一个将数据均匀分段1,2,5的随写 读写文件 C#二进制序列化和反序列化
C# 持续序列化对象追加到文件的方法
UnseenstoneX · 2018-06-12 · via 博客园 - UnseenstoneX

最近有个需求,将内存和帧数数据序列化到二进制文件。为了节省内存,采用了100个对象的数组,每次存满就序列化到文件,然后归零继续存,以追加的性式继续序列化到原有文件。

这样相当于多个数组对象存在了同一个序列化文件。反序列化的时候需要处理一下。思路是先反序列化出来一个,然后修改文件读取的Offset,继续反序列化下一个,直到文件末尾。

1 namespace ProfilterDataNS
2 {
3     [Serializable]
4     public class ProfilterData
5     {
6         public float fps=0;
7         public float memory=0;
8     }
9 }

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using ProfilterDataNS;
 4 using System.IO;
 5 using System.Runtime.Serialization.Formatters.Binary;
 6 
 7 public class DataCache{
 8     string _filePath="profilterData.bin";
 9     int _limitNum=100;
10     int _index=0;
11     ProfilterData [] _cacheArr;
12     FileStream fStream;
13 
14     private BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
15     
16     public DataCache(int limitNum,string filePath)
17     {
18         _index=0;
19         _filePath=filePath;
20         _limitNum=limitNum;
21         _cacheArr=new ProfilterData[limitNum];
22         for(int i=0;i<_cacheArr.Length;i++)
23         {
24             _cacheArr[i]=new ProfilterData();
25         }
26         //如果有同名旧文件存在,先覆盖一次旧文件
27         fStream = new FileStream(_filePath,FileMode.Create);
28         fStream.Close();
29         fStream.Dispose();
30         //以追加的形式
31         fStream=new FileStream(_filePath,FileMode.Append,FileAccess.Write);
32     }
33     
34     ~DataCache()
35     {
36         fStream.Close();
37         fStream.Dispose();
38     }
39     /// <summary>
40     /// 添加数据
41     /// </summary>
42     /// <param name="fps"></param>
43     /// <param name="memory"></param>
44     public void Append(float fps,float memory)
45     {
46 
47         if(_index==_limitNum)
48         {
49             WriteData(_cacheArr);
50         }
51 
52         ProfilterData profData=_cacheArr[_index];
53         profData.fps=fps;
54         profData.memory=memory;
55         _index++;
56     }
57 
58 
59     /// <summary>
60     /// 立即结算数据,通常在结束时调用
61     /// </summary>
62     public void SettleAtOnce()
63     {
64         if(_index!=0)
65         {
66             ProfilterData [] tempArr=new ProfilterData[_index];
67             for(int i=0;i<tempArr.Length;i++)
68             {
69                 tempArr[i]=_cacheArr[i];
70             }
71             WriteData(tempArr);
72         }
73 
74         fStream.Close();
75         fStream.Dispose();
76     }
77 
78     /// <summary>
79     /// 写入数据
80     /// </summary>
81     private void WriteData(ProfilterData [] arr)
82     {
83         binFormat.Serialize(fStream, arr);
84         _index=0;
85     }
86 }

序列化类

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using ProfilterDataNS;
 4 using System.IO;
 5 using System.Runtime.Serialization.Formatters.Binary;
 6 
 7 public class AnalyzeData{
 8     public static List<ProfilterData> Analyze(string filePath)
 9     {
10         MemoryStream ms = new MemoryStream();
11         BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
12 
13         List<ProfilterData> profList=new List<ProfilterData>();
14 
15         using (FileStream fs= File.OpenRead("profilterData.bin"))
16         {
17             int offset=0;
18             while(fs.Position<fs.Length)
19             {
20                 ProfilterData []dataArr=(ProfilterData[])binFormat.Deserialize(fs);
21                 profList.AddRange(dataArr);
22                 binFormat.Serialize(ms, dataArr);//序列化到内存流中
23                 byte[] bt = ms.ToArray();
24                 offset=bt.Length;//获取偏移量
25             }
26             fs.Close();
27             fs.Dispose();
28         }
29         return profList;
30     }
31 }

反序列化类