17.2.2 文档类实现中的序列化(1)
在SketcherDoc.cpp文件中,有两个部分与序列化有关。第一个部分是与DECLARE_ DYNCREATE()宏互补的IMPLEMENT_DYNCREATE()宏:
- // SketcherDoc.cpp : implementation of the CSketcherDoc class
- //
- #include "stdafx.h"
- // SHARED_HANDLERS can be defined in an ATL project implementing preview, thumbnail
- // and search filter handlers and allows sharing of document code with that project.
- #ifndef SHARED_HANDLERS
- #include "Sketcher.h"
- #include "PenDialog.h"
- #endif
- #include "SketcherDoc.h"
- #include <propkey.h>
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- // CSketcherDoc
- IMPLEMENT_DYNCREATE(CSketcherDoc, CDocument)
- // Message maps and the rest of the file...
这个宏把CSketcherDoc类的基类定义为CDocument。为了正确地动态创建CSketcherDoc对象,包括创建继承这个基类的成员,必须有这个宏。
1. Serialize()函数
在CSketcherDoc类实现中还包括Serialize()函数的定义:
- void CSketcherDoc::Serialize(CArchive& ar)
- {
- if (ar.IsStoring())
- {
- // TODO: add storing code here
- }
- else
- {
- // TODO: add loading code here
- }
- }
该函数序列化这个类的数据成员。传递给这个函数的参数ar是对CArchive类对象的引用。如果操作是在文件中存储数据成员,那么这个类对象的IsStoring()成员将返回TRUE,如果操作是从以前存储的文档中读回数据成员,则返回FALSE。
因为Application Wizard不知道您的文档中包含什么数据,所以就像注释所表明的那样,读写这些信息的过程全依赖于您。为了了解这个过程,下面比较详细地分析一下CArchive类。
2. CArchive类
CArchive类是发动序列化机制的引擎。C++(www.cppentry.com)中的流操作在控制台程序中从键盘读取数据,然后写入屏幕,CArchive类则提供了基于MFC的流操作。CArchive对象提供了一种机制,将您的对象流出后放到文件中,或者重新把它们恢复为输入流,在这个过程中自动地重新构造类的对象。
CArchive对象有一个与其相关联的CFile对象,它为二进制文件提供了磁盘输入/输出功能,并且提供到物理文件的实际连接。在序列化过程中,CFile对象处理文件输入和输出操作的所有具体问题,CArchive对象处理组织写入的对象数据或者根据读取的信息重新构造对象的逻辑问题。只有在构造自己的CArchive对象时,才需要考虑关联对象CFile的细节问题。对于Sketcher程序中的文档,框架已经进行了处理,并且把它构造的CArchive对象ar传递给CSketcherDoc中的Serialize()函数。在实现Serialize()函数的序列化时,可以在添加到形状类中的所有Serialize()函数中使用相同的对象。
CArchive类重载了析取和插入运算符(<<和>>),它们对派生于CObject的类的对象以及大量基本数据类型分别进行输入和输出操作。这些重载运算符处理下列对象类型和简单类型,见表17-1。
表 17-1
|
类 型
|
定 义
|
|
bool
|
布尔值,真或假
|
|
float
|
标准单精度浮点值
|
|
double
|
标准双精度浮点值
|
|
BYTE
|
8位无符号整数
|
|
char
|
8位字符
|
|
wchar_t
|
16位字符
|
|
short
|
16位有符号整数
|
|
int
|
32位有符号整数
|
|
LONG和long
|
32位有符号整数
|
(续表)
|
类 型
|
定 义
|
|
LONGLONG
|
64位有符号整数
|
|
ULONGLONG
|
64位无符号整数
|
|
WORD
|
16位无符号整数
|
|
DWORD和unsigned int
|
32位无符号整数
|
|
CString
|
定义字符串的CString对象
|
|
SIZE和CSize
|
该对象把尺寸定义为cx, cy 对
|
|
POINT和CPoint
|
该对象把点定义为x, y 对
|
|
RECT和CRect
|
该对象利用矩形的左上角和右下角定义矩形
|
|
CObject*
|
指向CObject的指针
|