1 / 19
文档名称:

第13单元 序列化与文档打印.doc

格式:doc   页数:19
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第13单元 序列化与文档打印.doc

上传人:中国课件站 2011/10/11 文件大小:0 KB

下载得到文件列表

第13单元 序列化与文档打印.doc

文档介绍

文档介绍:第13单元文档读写与打印
本单元教学目标
介绍在文档/视图结构中文档读写的基本手段——序列化,以及文档打印的编程技术。
学习要求
理解序列化的基本思想和MFC的打印工作流程,可编写相应的处理程序。
授课内容
序列化(Serialize)
文档对象的序列化(Serialize)是指文档对象可以将其当前状态(由其成员变量的值表示)写入到永久性存储体(通常是指磁盘)中,以后还可从永久性存储体中读取对象的状态(载入),从而重建对象。这种对象的保存和恢复的过程称为序列化。保存和载入序列化的数据通过CArchive类的对象作为中介来完成。
文档的序列化在文档类的Serialize()成员函数中进行。当用户选择文件菜单的File Save、Save As或Open选项时,都会自动调用这一成员函数。由于应用程序的数据结构各不相同,所以应重载文档派生类的Serialize()成员函数,使其支持对特定数据的序列化。
AppWizard在生成应用程序时只给出了一个Serialize()函数的框架,程序员要做的工作是为其添加代码,以实现具体数据的序列化。AppWizard生成的Serialize()函数由一个简单的if-else语句组成:
void CMyDoc::Serialze(CArchive& ar)
{
if(())
{
// TODO: add storing code here.
}
else
{
// TODO: add loading code here.
}
}
其中参数ar是一个CArchive类型的对象,该对象包含一个CFile类型的文件指针。CArchive对象为读写CFile(文件类)对象中的可序列化数据提供了一种类型安全的缓冲机制。通常CFile类对象代表一个磁盘文件。
CArchive类的成员函数IsStoring()用于通知Serialize()函数是需要写入还是读取序列化数据。如果数据要写入(Save或Save As),IsStoring()返回布尔值TRUE;如果数据是被读取(Open),则返回FALSE。
CArchive类对象使用重载的插入(<<)和提取(>>)操作符执行读和写操作。这种方式与cin和cout中的输入输出流非常相似,只是这里处理的是对象,不象cin和cout那样,处理的是ASCII字符串。
[例13-1] 序列化。如果例12-1的吹泡泡程序使用一般的数组存放泡泡数据(参看例9-1的程序):
CRect m_rectBubble[MAX_BUBBLE];
int m_nBubbleCount;
为其文档类重新设计Serialize()函数。
说明:按例12-1的方法建立项目和输入源代码,但将文档类中的泡泡数据改为以上两行的形式。修改文档类的Serialize()函数,代码如下。
程序:
// 序列化函数
void CMyDoc::Serialze(CArchive& ar)
{
if(())
{
ar << m_nBubbleCount;
for(int i=0; i<m_nBubbleCount; i++)
ar << m_rectBubble[i];
}
else
{
ar >> m_nBubbleCount;
for(int i=0; i<m_nBubbleCount; i++)
ar >> m_rectBubble[i];
}
}
分析:在编写序列化函数时,一定要注意写入顺序要和读出顺序一一对应。在本例中,先写入数据成员m_nBubbleCount,再写入泡泡数组m_rectBubble,那么在读出时也要遵循相同的顺序,先读m_nBubbleCount的值,然后再读泡泡数组的各元素值。
在设计Serialize()函数时,还要注意各数据之间的关系。在本例中,一定要先读m_nBubbleCount的值,否则在读泡泡数组时还不知道数组中有几个元素,也就无法确定循环次数。读数据的顺序确定以后,写数据的顺序自然也就定下来了。
因为CObject类支持序列化(CObject类有Serialize()成员函数),所以COjbect派生类也支持序列化。例如,数组类CArray支持序列化,所以如果文档数据存放在CArray类对象中,就可象例12-1中那样,在重载的文档派生类的Serialize()成员函数中直接调用CArray对象的Serialize()成员函数:
void CMyDoc::Serialize(CArchive &ar)
{
(ar);
}
这正是例12-1中的做法。当然