本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
1. Document的作用
(1) 对数据进行管理和维护。
数据将保存在文档类的成员变量中。试图完成用于数据的交互,并通过调用 CDocument::SetModifiedFlag(Boolean bFlag) 来设定是否在关闭文档时保存数据。
(2) 负责数据源的永久保存,通常是磁盘文件或数据库,即串行化。
2. 流程图
3. 可重载函数
- Serialize()
- OnNewDocument()
- OnOpenDocument()
- DeleteContents()
4. CArchive的使用(不适用MFC的Framework)
- CFile myFIlemyFIle.open(pFileName,CFile::modeWrite);
- CArchive myAr(&myFile, CArchive::store);
- ……
- ……
- myAr.close();
- myFile.close();
(1) CArchive除可以完成CFile的基本功能(如,write()、read())外,还支持“<<”、“>>”运算符,以实现串行化。
(2) 要使用“<<”、“>>”,对象必须通过DECLARE_SERIAL()声明为可串行化对象或继承自可串行化对象
本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
5. Serialize函数的实现
MFC可自动生成框架,并自动生成对CFile与CArchive的关联。用户只需要实现Serialize()的重载。
- void CProgramDoc::Serialize(CArchive& ar)
- {
- if (ar.IsStoring())
- {
- ar << m_strText; // 对可串行化数据
- ar.write(……); // 对不可串行化数据,只能直接使用write函数
- }
- else
- {
- ar >> m_strText; // 对可串行化数据
- ar.read(……); // 对不可串行化数据,只能直接使用write函数
- }
- pDoc->SetModifiedFlag(TRUE); // 关闭文档时会提示保存
- }
6. 自定义的类如何实现serialize
需要符合下列五大原则:
(1) 派生自CObject:
可保有RTTI、Dynamic Creation等机制;
可获得某些串行化所需的函数,如IsKindOf、IsSerializable、Serialize;
(2) 有DECLARE_SERIAL宏
(3) 有IMPLEMENT_SERIAL宏
(4) 实现虚函数Serialize()
以正确的把变量写入文件或读出文件,实现方式见上节;
(5) 加上default构造函数
因为动态创建时会用到;
本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net
阅读(3070) | 评论(0) | 转发(0) |