序列化就是往硬盘上写文件
文档读写的类 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<<age;//过程是先把age存到m_lpBufCur指向的内存中去,然后使m_lpBufCur的值加上age数据类型的长度,方便下一个数据存储
CString str = "ZhangSan";
ar<<str;//和其他类型不同的是,字符串类型会先获取字符串的长度,并将长度写道m_lpBufCur指向的内容
//长度是unsigned char类型,占据一个字节,m_lpBufCur自加1
//然后把字符转复制到m_lpBufCur指向的地址,m_lpBufCur自加字符串的长度
//CMyDoc data(18, 88.5, "zhangsan");
//ar << &data; //序列化对象,就是将对象的各个成员变量序列化。
ar.Close( );//之前的所有内容只是把数据存到堆里面去了,但是还没有写到硬盘里
//在Close函数里面,统一把所有的数据写道硬盘里,写入字节大小就是堆里所有数据加起来大小,即m_lpBufCur-m_lpBufStart
<