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

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

 namespace ProfilterDataNS
{
[Serializable]
public class ProfilterData
{
public float fps=;
public float memory=;
}
}
 using System.Collections;
using System.Collections.Generic;
using ProfilterDataNS;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; public class DataCache{
string _filePath="profilterData.bin";
int _limitNum=;
int _index=;
ProfilterData [] _cacheArr;
FileStream fStream; private BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器 public DataCache(int limitNum,string filePath)
{
_index=;
_filePath=filePath;
_limitNum=limitNum;
_cacheArr=new ProfilterData[limitNum];
for(int i=;i<_cacheArr.Length;i++)
{
_cacheArr[i]=new ProfilterData();
}
//如果有同名旧文件存在,先覆盖一次旧文件
fStream = new FileStream(_filePath,FileMode.Create);
fStream.Close();
fStream.Dispose();
//以追加的形式
fStream=new FileStream(_filePath,FileMode.Append,FileAccess.Write);
} ~DataCache()
{
fStream.Close();
fStream.Dispose();
}
/// <summary>
/// 添加数据
/// </summary>
/// <param name="fps"></param>
/// <param name="memory"></param>
public void Append(float fps,float memory)
{ if(_index==_limitNum)
{
WriteData(_cacheArr);
} ProfilterData profData=_cacheArr[_index];
profData.fps=fps;
profData.memory=memory;
_index++;
} /// <summary>
/// 立即结算数据,通常在结束时调用
/// </summary>
public void SettleAtOnce()
{
if(_index!=)
{
ProfilterData [] tempArr=new ProfilterData[_index];
for(int i=;i<tempArr.Length;i++)
{
tempArr[i]=_cacheArr[i];
}
WriteData(tempArr);
} fStream.Close();
fStream.Dispose();
} /// <summary>
/// 写入数据
/// </summary>
private void WriteData(ProfilterData [] arr)
{
binFormat.Serialize(fStream, arr);
_index=;
}
}

序列化类

 using System.Collections;
using System.Collections.Generic;
using ProfilterDataNS;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; public class AnalyzeData{
public static List<ProfilterData> Analyze(string filePath)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器 List<ProfilterData> profList=new List<ProfilterData>(); using (FileStream fs= File.OpenRead("profilterData.bin"))
{
int offset=;
while(fs.Position<fs.Length)
{
ProfilterData []dataArr=(ProfilterData[])binFormat.Deserialize(fs);
profList.AddRange(dataArr);
binFormat.Serialize(ms, dataArr);//序列化到内存流中
byte[] bt = ms.ToArray();
offset=bt.Length;//获取偏移量
}
fs.Close();
fs.Dispose();
}
return profList;
}
}

反序列化类

C# 持续序列化对象追加到文件的方法的更多相关文章

  1. Android 使用Parcelable序列化对象

    转:http://ipjmc.iteye.com/blog/1314145       Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现 ...

  2. Java基础之序列化对象——将对象写入到文件中(SerializeObjects)

    控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...

  3. 每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)

    一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象.所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象.一个应用是,程序在执行过程中突 ...

  4. C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...

  5. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  6. Android中序列化对象到XMl 和 XML反序列化为对象

    package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...

  7. 使用XMl序列化器生成xml文件

    生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...

  8. C#程序将对象保存为json文件的方法

    首先,从NuGet上下载JSON .Net,安装到所需项目中. 对象obj保存到文件的步骤: 1. 创建文件 // 获取当前程序所在路径,并将要创建的文件命名为info.json string fp ...

  9. C# 调用Webservice并传递序列化对象

    原文:C# 调用Webservice并传递序列化对象 C#动态调用WebService注意要点 1.动态调用的url后面注意一定要加上?WSDL   例如:string _url = "ht ...

随机推荐

  1. YUV12(420) (from)to RGB24

    直接上代码 #include <opencv2/opencv.hpp> #include <stdio.h> #define min(a,b) ((a<b)?a:b) # ...

  2. 初识Kafka:构架、生产消费模型以及其他相关概念

    当前使用的事件总线采用的是Kafka分布式消息队列来完成的,近来项目需要接入到事件总线中,故开启了kafka的学习之旅(之前一直在听说kafka这玩意儿,但是学习计划中还没有将它安排进去,借着这个机会 ...

  3. cakephp事务处理

    使用cakephp框架做开发时,涉及到多个数据表的数据保存,需要使用cakephp的事务处理,查cakephp的说明手册也没看明白,从开发社区中看到了解决的办法,考虑到英文的问题,所以转给大家,以供参 ...

  4. Java Web---登录验证和字符编码过滤器

    什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...

  5. zStack学习笔记(原创,绝对不是抄的……)

    我之前写的文章都没写上面那句,但是这篇写了,主要是因为zStack文章抄袭太严重……故此声明 因为涉及到数据的双向交互问题,所以在这里我考虑使用协议栈来实现数据的收发.首先说下如何在Zstack中添加 ...

  6. node - 导包机制

    在学node js的时候,经常各种导包 let http = require('http'); 然后它的运行机制: 1. 查找当前目录下面的node_modules 2. 全局查找(首先添加到path ...

  7. userDao

    比如,我们这里有一个接口IUserDao,里面有,add和del两个方法.我们在项目中,有一个他的实现类:UserDao.但是我们现在想要统一为这个接口的所有实现类都添加一个查询search方法,那么 ...

  8. 阿里云OSS设置跨域访问

    OSS 提供 HTML5 协议中的跨域资源共享 CORS 设置,帮助您实现跨域访问.当 OSS 收到一个跨域请求(或者 OPTIONS 请求)时,会读取存储空间对应的 CORS 规则,然后进行相应的权 ...

  9. 虚拟机安装Ubuntu 12.04 出现提示“Ubuntu is running in low-graphics mode?”

    原文链接: http://blog.csdn.net/maimang1001/article/details/17048273 http://blog.csdn.net/bluetropic/arti ...

  10. 在VS2013 IIS Express 添加MIME映射

    打开VS2013返回json提示MIME映射问题 1.在DOS窗口下进入IIS Express安装目录,默认是C:\Program Files\IIS Express,cmd  命令行cd 到 该目录 ...