序列化就是往硬盘上写文件
文档读写的类 CFile
CFile::Open CFile::Write/Read CFile::Close CFile::SeekToBegin/SeekToEnd/Seek //控制光标位置
序列化机制使用(内置类型)
写文件时需要先把文件写到CArchive的缓冲区,再把缓冲区写道硬盘上 CFile 文档操作类,完成硬盘文件的读写操作 CArchive 归档类,完成内存数据的读写操作
CFile::Open 创建或者打开文件 CArchive ar(&file,mode,size); 定义归档类对象,构造传入文档类对象、读取方式和缓冲区大小 ar<<数据; 序列化(存储/写) ar.close(); 关闭归档类对象 CFile::Close(); 关闭文件
class CArchive{
enum MODE{
store=0,load=1,...};
BOOL m_nMode;//访问方式
int m_BufSize;//缓存大小
CFile* m_File;//文件类对象
BYTE* m_lpBufCur;//当前指向,维护缓冲区里指针当前指向地址
BYTE* m_lpBufMax;//终止指向,维护缓冲区尾地址
BYTE* m_lpBufStart;//开始指向,维护缓冲区首地址
......
};
序列化:
CFile file;
file.Open("E:/MFC/serial.txt", CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file, CArchive::store, 4096);//归档类对象,维护缓冲区。
//构造函数过程做了以下内容:
//首先是给ar对象各个成员变量赋值
//其次,根据传入的缓冲区大小new一个数组,并返回地址到m_lpBufStart
//根据缓冲区大小和m_lpBufStart计算出m_lpBufMax
//令m_lpBufCur ===m_lpBufStart
long age = 18;
ar< CString str = "ZhangSan"; ar< //长度是unsigned char类型,占据一个字节,m_lpBufCur自加1 //然后把字符转复制到m_lpBufCur指向的地址,m_lpBufCur自加字符串的长度 //CMyDoc data(18, 88.5, "zhangsan"); //ar << &data; //序列化对象,就是将对象的各个成员变量序列化。 ar.Close( );//之前的所有内容只是把数据存到堆里面去了,但是还没有写到硬盘里 //在Close函数里面,统一把所有的数据写道硬盘里,写入字节大小就是堆里所有数据加起来大小,即m_lpBufCur-m_lpBufStart < 好文阅读
发表评论