第13章 文档与串行化
1. 使用CArchive类对文件进行读写操作
CArchive类对象将对象数据保存到永久设备上,例如磁盘文件,让对象数据持久性的过程就称之为串行化(活序列化);
在创建CArchive对象之前必须先创建一个CFile类或者其派生类对象,并且因此存档对象既可以用来加载数据,也可以用来保存数据,所以确保这个CFile类对象的打开方式与该文档对象的加载/保存状态相一致。
2. 写操作
//先构造CFile文件对象
CFilefile("1.txt",CFile::modeCreate | CFile::modeWrite);
//构造存档对象
CArchivear(&file,CArchive::store);
inti=4;
charch='a';
//在C++中,浮点数默认情况下是定义为double类型,所以后面加个f
floatf=1.3f;
CStringstr("http://www.sunxin.org");
//保存数据
ar<<i<<ch<<f<<str;
3串行化读取操作
//构造CFile文件对象
CFilefile("1.txt",CFile::modeRead);
//构造存档对象
CArchive ar(&file,CArchive::load);
int i;
char ch;
float f;
CString str;
CString strResult;
//读取数据,注意顺序要跟保存的一致
ar>>i>>ch>>f>>str;
strResult.Format("%d,%c,%f,%s",i,ch,f,str);
MessageBox(strResult);
3. MFC框架提供的文件新建功能
C**Doc类中的OnNewDocument函数就是【文件/新建】命令处理的一部分,由框架调用;
可在这里设置文档标题:SetTitle(“http://www.sunxin.org”);
4. 也可以在IDR_MAINFRAME字符串资源里面修改文档标题
第一个\n和第二个\n之间的值就是
5. IDR_MAINFRAME资源是在C**App类中的InitInstance函数中调用的;它共有7个字串;
6. 在函数前面有afx_msg标识符,说明这是个菜单命令响应函数;
7. 当程序运行时候,MFC框架内部接收的无论是文档类指针、框架类指针、或者是视类指针,它们都是指向派生类的指针;
8. 文档串行化:文档类的Serialize函数
Serialize函数就是文档类提供的用来保存和加载数据的函数,我们可以利用其参数提供的CArchive对象来保存或者加载我们自己的数据;
注意:当保存后直接打开是打开不了的,除非你更好了另外一个文档类对象再重新打开
这是MFC的机制:文档类负责管理数据,提供对数据的保存和加载,视类负责显示数据,为用户提供编辑数据和修改数据的功能;
9. 对于多文档程序来说,每打开一个文件都会构造一个新的文档对象,但是注意单文档不同,对于单文档来说,文档对象本身不会被销毁,它只是将数据清空,然后再与一个新的文件关联;
10. 实现一个类可串行化,有5个步骤(看书)
一个可串行化的类通常都有一个Serialize成员函数
11. 对于一个文档类对象来说,可以有多个视类对象与相关;
但对一个视类对象来说,它只能与一个文档类对象相关;
12. 当先前保存数据的版本号跟现在读取时数据的版本号不一致的时候,就会弹出警告框:非预期的文件格式;
13. MFC的Document/View结构:
有关文件读写的操作,在CDocument的Serialize函数中进行;
有关数据和图形显示的操作在CView的OnDraw函数中进行;
14. DeleteContents函数是一个虚函数,主要是由框架调用,用来删除文档的数据,同时并不销毁CDocument对象本身,它是在文档将要被销毁之前被调用,它也会在该文档对象再重复使用之前被调用,以确保文档是空的。