IMPLEMENT_SERIAL(CSample, CObject, 0) //该宏一般应包含在Sample.cpp 文件中
IMPLEMENT_SERIAL()宏用于定义从CObject 中派生可序列化类时所需的各种函数。在
类的实现文件(.CPP)中使用这个宏。该宏的前两个参数是类名和直接基类的名称。
该宏的第三个参数是架构编号。架构编号实质上是类对象的版本号,它使用大于或等于
零的整数。MFC 序列化代码在将对象读取到内存时检查该架构编号。如果磁盘上对象的架构
编号与内存中类的架构编号不匹配,库将引发CArchiveException 防止程序读取对象的不正确
版本。
(4)定义不带参数的构造函数
对象从磁盘上加载后,MFC 通过CreateObject()函数自动重新创建这些对象。而
CreateObject()函数创建对象时需要一个默认的构造函数。可将该构造函数声明为公共的、受
保护的或私有的。在此之前,请确保它仅由串行化函数使用。
3.编写Serialize()函数
在CObject 类中定义的Serialize()成员函数,实际上是对捕获对象的当前状态所必需的数
据进行串行化。因此在为类做好串行化的准备后,再为类重载CObject 的Serialize()成员函数,
就可以实现串行化的功能。例如CSampleData 类中有如下的成员变量:
public:
CString m_strNcom;
int m_nType;
实现CSampleData 的序列化,就需要将这两个成员变量保存到磁盘中或者从磁盘中装入,
于是将CSampleData::Serialize()函数代码修改为:
void CSampleData::Serialize(CArchive& ar)
{
CObject::Serialize(ar); //进行基类的序列化
if (ar.IsStoring()) {
ar << m_strNcom << m_nType; //保存数据
}
else {
ar >> m_strNcom >> m_nType; //读取数据
}
}
在上面的代码中,首先调用基类的Serialize()函数进行基类的序列化,保证保存和装入的
数据的正确xìng。
Serialize()函数具有CArchive 参数ar 的特xìng,即读写对象数据。CArchive 对象中包括成
枫叶文学网www.fywxw.com
第8 章 文件cāo作
·179·
员函数IsStoring(),该成员函数返回值为TRUE 时表示Serialize()正在存储(即正在写入数据),
反之则表明正在加载(即正在读取数据)。用IsStoring()的结果作为参考,使用输出运算符(<<)
将对象数据chā入到CArchive 对象中或使用输入运算符(>>)提取数据。这也反映了MFC 串
行化的顺序xìng,即不能进行