字体
第(4/5)页
关灯
   存书签 书架管理 返回目录

    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,即不能进行
上一页 目录 下一页