MFC(序列化机制,文档读写)

本文介绍了MFC中的序列化机制,包括CFile类用于文档读写的操作,如Open、Write/Read、Close及Seek方法。重点讲解了CArchive类在序列化内置类型和自定义类型时的作用,以及如何实现对象的序列化和反序列化,包括DECLARE_SERIAL、IMPLEMENT_SERIAL宏的使用以及重写Serialize函数的过程。
摘要由CSDN通过智能技术生成

序列化就是往硬盘上写文件

文档读写的类 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
	<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值