内部培训资料第8章文档序列化.doc

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内部培训资料第8章文档序列化

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 第8章 文档序列化 大多数应用程序都为用户提供了数据的保存功能,这些数据可能是电子表格、字处理文档、一组数据或图形等等。从磁盘存储器上存取这些数据的工作往往是通过文件操作或者数据库操作来完成的。关于数据库操作的内容,我们将在后面的章节中进行详细的介绍,在本章的内容中,我们主要讨论如何通过文件操作实现一般意义上的数据存取工作。 通过文件操作来实现数据的存取工作通常有两种工作方式:一种是使对象具有序列化;另一种方法就是直接使用CFile对象处理文件。本章就将对这两部分内容分别做出详解。 8.1 序列化 在MFC当中,对象的序列化功能主要是通过文档/视图结构中特有的文档对象的序列化机制来实现的。本节,我们将详细介绍如何使用序列化机制来实现对象的序列化。 序列化,简单地说就是向一个持久性的存储媒体——如磁盘文件保存对象或读取对象的过程。序列化分为两部分,当把应用程序数据以文件形式存储在系统磁盘中时,叫做序列化;当从磁盘文件中恢复应用程序数据的状态时,叫做反序列化,这两个部分的组合构成了Visual C++中的应用程序对象的序列化。 8.1.1 CArchive类和Serialize函数 Visual C++应用程序中的序列化是通过CArchive类来实现的。CArchive类总是与一个CFile对象相关联,CArchive类是作为CFile对象的输入输出流而设计的,如图8-00所示,它使用经过重载的C++流入()和流出()操作符从存储应用程序数据的文件中实现读取和写入数据,而将这些数据保存到磁盘文件中的工作由CArchive对象指示CFile对象来完成。 应用程序框架 应用程序框架 应用程序 应用程序 对象 序列化函数 CFile CFile CArchive类 图8-00 CArchive类和CFile类 可以实现序列化的类——即从CObject继承而来的类,有一个叫做Serialize的成员函数,序列化工作主要是在这个函数当中进行的。当应用程序读取或写入文件时,文档对象的Serialize函数被调用,并传递用于从文件读取或向文件写入数据的CArchive对象。在Serialize函数中,要遵循的典型逻辑是通过调用CArchive类的IsStoring或IsLoading函数来判定当前行为是正在对文件写入还是读取。根据这两个函数中任何一个的返回值即可判定应用程序需要从CArchive类的I/O流中读取还是向其写入。 当用户在打开或保存拥有文档对象数据的文件或者使用文档对象的Open、Save、Save As菜单命令时,MFC便会自动调用Serialize函数,一个典型的Serialize函数如下所示: void CAge::Serialize( CArchive ar ) { CObject::Serialize( ar ); ? ?? if( ar.IsStoring() ) ? ?? ar m_years; ?? ? else ?? ? ar m_years; } 其中,ar是一个指明应用程序序列化对象的CArchive引用参数。CArchive::Serialize成员函数可以告诉用户序列化对象当前是否用来存储或加载。可以将Serialize函数放置在所创建的任何类中,以便文档的Serialize函数中调用这些类的Serialize函数。 8.1.2 使自己的类支持序列化 在前几章讲过的例子中使用CString类的字符串来保存文本行,由于它是MFC类,因此可以串行化自己,将自己写入磁盘或从磁盘文件中读取二进制数据来建立对象。那么,如果不是标准的MFC类,比如用户自己定义的类,如何让它支持序列化呢? 要让用户定义的类支持序列化,一般分为五步: 1.从CObject或其派生类派生出用户的类 2.在类声明文件中,加入DECLARE_SERIAL宏。编译时,编译器将扩充该宏,这是串行化对象所必需的。 3.重载Serialize()成员函数,加入必要的代码,用以保存对象的数据成员到CArchive对象以及从CArchive对象载入对象的数据成员状态。 4.定义一个不带参数的构造函数。 5.在实现文件中加入IMPLEMENT_SERIAL宏。 下面将通过一个实例来演示如何让用户定义的类支持序列化功能。 8.1.3 实例:保存和显示图形 还记得第6章的绘图程序吗,用户画好的图形不仅不能保存下来,而且当窗口发生重绘时,图形也就不见了,本实例就将解决这两个问题,不仅使所画的图形在窗口重绘时依然保留,而且还给它添加了保存及再显示功能。我们在第6章绘图程序

文档评论(0)

2017meng + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档