友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第70章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




CObject 类派生,从而获得对 CObject 的序列化协议及功能的访问权限。  



    (2 )添加 DECLARE_SERIAL()宏  

    设置好基类后,在类的声明中添加一个 DECLARE_SERIAL()宏,具体代码如下:  



    class CSample : public CObject    // 由 CObject 派生  



    {  



    public:  



         ……//其他成员变量和成员函数的定义  



                                                                               ·177 ·  


…………………………………………………………Page 189……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         DECLARE_SERIAL(CSample)      //声明串行化,参数为该类的类名  



          ……//其他成员变量和成员函数的定义  



     };  



     (3 )添加 IMPLEMENT_SERIAL()宏  

     在类的实现文件中添加 IMPLEMENT_SERIAL()宏,具体代码如下:  



     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_strName;  



         int  m_nType;  



     实现 CSampleData 的序列化,就需要将这两个成员变量保存到磁盘中或者从磁盘中装入, 

于是将 CSampleData::Serialize()函数代码修改为:  



     void CSampleData::Serialize(CArchive& ar)  



     {  



         CObject::Serialize(ar);   //进行基类的序列化  



         if (ar。IsStoring()) {  



              ar  m_strName 》》 m_nType;  //读取数据  



         }  



     }  



     在上面的代码中,首先调用基类的 Serialize()函数进行基类的序列化,保证保存和装入的 

数据的正确性。  

     Serialize()函数具有 CArchive 参数 ar 的特性,即读写对象数据。CArchive 对象中包括成 



 ·178 ·  


…………………………………………………………Page 190……………………………………………………………

                                                                         第 8 章    文件操作  



员函数 IsStoring(),该成员函数返回值为 TRUE 时表示 Serialize()正在存储(即正在写入数据 ), 

反之则表明正在加载(即正在读取数据 )。用 IsStoring() 的结果作为参考,使用输出运算符(》 )提取数据。这也反映了 MFC 串 

行化的顺序性,即不能进行随机的读写操作,一次调用只能读取或只能保存。  

    在串行化代码中需要对各种数据类型进行处理,主要分为下列几种情况。  



     (1)固有数据类型  

    CArchive 类的插入运算符(》 )对许多 C++ 固有的数据类型进行了 

重载,可以直接使用。例如在上面的程序中要对 int  的成员变量 m_nType 进行串行化,即可 

直接使用插入运算符和提取运算符。下面列出一些被 CArchive 类默认支持的数据类型:  

    o  BYTE :8 位无符号整数。  

    o  WORD :16 位无符号整数。  

    o  LONG :32 位带符号整数。  

    o  DWORD :32 位无符号整数。  

    o  float:单精度浮点数。  

    o  double :双精度浮点数。  

    o  int :32 位带符号整数。  

    o  short:16 位带符号整数。  

    o  char :8 位字符类型。  

    o  unsigned :32 位无符号整数。  



     (2 )CString 和 CRect 等类型  

    CString 和 CRect 等类型,虽然不是从 CObject 派生的类,但是它们有自己针对 CArchive 

类的重载插入运算符和提取运算符,因此也可以直接使用这两个运算符进行串行化。  



     (3 )自定义的类  

     如果序列化的类中包含其他自定义的内嵌对象,则需要处理后再进行串性化。例如在 

CSampleData 类中添加如下的新数据成员:  



    public:  



         CSampleChildData m_data;  



    将   CSampleData  类串行化时,需要对             CSampleChildData  进行额外的处理。首先使得 

CSampleChildData 继承 CObject,然后编写它自己的 Serialize()成员函数。这时 CSampleData 

类的 Serialize()函数可以进行如下修改以实现对 m_data 的串行化:  



    void CSampleData::Serialize(CArchive& ar)  



     {  



         CObject::Serialize(ar);   //进行基类的序列化  



         if (ar。IsStoring()) {  



             ar  m_strName 》》 m_nType;  //读取数据  



         }  



                                                                                   ·179 ·  


…………………………………………………………Page 191……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         m_Data。Serialize(ar);            // 串行化 m_Data  



     }  



     如果 CSampleData 类中的 CSampleChildData 对象是通过指针在堆中创建的,则代码如下:  



     public:  



         CSampleChildData *m_pData;  



     将 CSampleData 类串行化更为简单。首先需要为 CSampleChildData 添加串行化代码,即 

继承  CObject,并添加相应的宏和构造函数,最后编写 CSampleChildData                             自己的 Serialize() 

函数。完成对  CSampleChildData          的修改后就可以在  CSampleData             类的    Serialize()函数中用 

CArchive 的插入和提取运算符进行串行化。代码如下:  



     void CSampleData::Serialize(CArchive& ar)  



     {  



         CObject::Serialize(ar);   //进行基类的序列化  



         if (ar。IsStoring()) {  



              ar 》 
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!