简介
文件序列化与反序列化,也可以叫文件打包与解包,相当于tar命令中的仅打包命令:tar –cvf。如果直接调用Tar命令,则会在硬盘上留下一个打包文件,使用的时候再读取到内存中,这种方法,打包时占用一份时间,解包时占用一份时间,读取到内存中也占用一份时间,如果调用的方式不对,可能会造成打包的时候还未打完包,调用函数就返回了,造成后续操作有误。这种情况,我们就可以自己写一套文件序列化与反序列化实现。
本文中主要讲实现,代码不予给出。
整体说明
将文件序列化,则至少要存储文件的这些信息:文件名,上一节点名,文件内容,为了说明这些内容,则要添加这些信息:文件名长度,文件大小等。这些信息作为文件头,文件内容作为文件体,整理后便于传输:
参考文件头:
struct stuDir
{
//父节点id
int nPID;
//当前节点id
int nCurID;
//当前文件名长度
int nFileNameSize;
//dir:1;file:2
int nFileType;
//dir不用这个参数
long long nFileSize;
//当前文件名
string strFileName;
}
序列化前:
文件名:abc
内容:“1234567890”
序列化后:
实现步骤
- 获取打包后文件大小,便于后面可每次定读取的大小范围。
- 生成文件树
- 统计全部文件头+全部文件大小
- 打包,传入读取的范围。
- 先输出文件头,后面跟着文件内容
- 解包,传入文件内容
- 根据文件头去解析,生成文件。
注意
- 文件头最好用结构体,便于序列化写入。
- 打包解包时,注意文件头部分的截断处理。