《VC++深入详解》学习笔记 第十三章 文档与串行化

(生死不明猫新人)

CArchive类实现将对象数据保存到永久设备上称之为串行化(二进制流)

使用说明:必须先新建CFile或其派生类后创建CArchive类对象,二者的打开方式等必须一致,一个文件只能和一个CArchive类关联

  同时支持CObject类及派生对象

CArchive类构造函数:  CArchive(文件对象指针,加载还是保存,缓存区大小,指定内存?);

文件写入:  构建文件对象    CFile file(...)

       >构建串行对象     CArchive ar(&file,...)

       >定义数据       int i = 4;char ch='a';

       >分别通过“<<”写入:   ar<<i<<ch;

文件读取:  构建文件对象    CFile file(...)

       >构建串行对象     CArchive ar(&file,...)

       >定义数据       int i;char ch;

       >分别通过“>>”读取:   ar>>i>>ch;  顺序一致,通过格式区分

          >数据处理显示

文档字符串:  IDR_MAINFRAME  通过GetDocString(返回值,查找索引)获取字符串

       (顺序排列)主窗口标题/文档默认标题/文档类型名(对话框显示)/过滤器/扩展名(组合使用)/。。/

文件/新建:  MFC提供文档/视类结构中,每一份文档产生时,会产生文档类对象、框架类对象和视类对象服务文档

        新建按钮对应响应函数封装在MFC架构中,调用XDoc::OnNewDocument()函数,同时程序界面出现前也调用一次该函数

        首先创建文档对象,再创建框架类对象,同时创建视类对象,框架和视类对象创建同时创建其窗口

MFC架构文档:  文档类负责数据管理(保存、加载),视类负责数据编辑修改。

文件/保存;打开:  XDoc::Serialize()在保存或加载按钮触发后会执行该函数,根据当前状态选择保存(if)和加载(else)

文件/打开:  CWinApp::OnFileOpen > CDocManager::OnFileOpen(该函数中调用文件打开对话框) > X::DoPromptFileName跳转

        > CSingDocument::OpenDocument > CDocument::OpenDocument(构造CFile对象;构造CArchive对象,调用Serialize)

        > 衍生XDoc::Serialize()  因为函数间跳转通过指针实现,所以不会有同一个文件二次打开情况

文件/保存:  同上类似,响应函数在CWinApp中。

        CWinApp:     管理文档管理器 > 文档管理器指针 m_pDocmanange

        CDocmanager:     文档管理器:管理文档模板 > 文档模板列表指针 m_templateList

        CSingDocTemplate:文档模板:管理文档类、框架类、视类

        CDocument:     文档类

类串行化:  以画图工程为例:画图工程中有一个CGraph类作为画图数据存放(每个图形的画图动作)

      该类要求:1、基类必须为CObject,2、该类中重写Serizlize成员函数,3、定义不带参构造函数

      4、DECLARE_SERIAL(ClassName)头文件中定义,5、IMPLEMENT_SERIAL(ClassName,BaseClassName,Version) 源文件开始定义

      其中4和5实现类的序列化,作为串行化的基本条件

      画图工程中通过画图操作完成的图形绘制需要保存,采用CObject派生的CObArray类来实现保存(CGraph类中创建对象)

      该类类似链表操作,添加元素采用OBject指针实现Add(),保存内容根据画图需要为(起点,终点,图形类型)

      通过文档类存取保存的对象

原文地址:https://www.cnblogs.com/sepmaple/p/9405044.html