文档的串行化

程序中用到了许多数据类型,特别是结构体和类,自定义的数据类型等。  
  你的程序处理的这种数据就是文档。  
  拿普通编辑器来说,肯定有一个cstring的数据用来存放用户编辑的文字,并且这串文字还有许多特性也需要记录,比如颜色,字体等,那没与此相关的就还有许多变量。  
  序列化的意思就是,如何将这些文档数据存盘,以及如何读取出来显示。那能有两种办法可以做到,一、利用cfile将每个数据依次写入磁盘,读取时又将文件中的数据依次读到变量,这种方式很繁琐,你必须依次做。  
  二、利用cfile和carchive配合,进行读写文件,并统一写为一个函数,例如:  
  mystruct     m_mydata1;  
  int               m_mydata2:  
  cstring       m_mydata3;  
  colorref     m_mydata4;   //等等  
   
  上面假设是一种编辑器要处理的数据,是cmydoc的成员。  
   
  void   cmydoc::serialize(carchive&   ar)  
  {  
        if(   ar.isstoring()   )   //如果是存盘  
        {  
                ar.write(   &m_mydata1,   sizeof(mystruct)   );  
                ar<<m_mydata2;  
                ar<<m_mydata3;  
                ar<<m_mydata4;  
                //上面后三行也可以写为ar<<m_mydata2<<m_mydata3<<m_mydata4;  
                //因为<<操作符又将返回一个carchive对象。  
        }  
        else   //如果是读取  
        {  
                ar.read(   &m_mydata1,   sizeof(mystruct)   );  
                ar>>m_mydata2;  
                ar>>m_mydata3;  
                ar>>m_mydata4;  
                //上面后三行也可以写为ar>>m_mydata2>>m_mydata3>>m_mydata4;  
                //因为>>操作符又将返回一个carchive对象。  
        }  
  }  
   
  当需要存盘时:  
  void   cmydoc::savefiletodisk()  
  {  
          cfile   file;  
          file.open(   "yourfile.mdt",   cfile::modewrite|cfile::modecreate   );  
          carchive   ar(   &file,carchive::store   );  
          serialize(   ar   );  
          ar.close();  
          file.close();  
  }  
   
  当需要读取文件时:  
  void   cmydoc::readfilefromdisk()  
  {  
          cfile   file;  
          file.open(   "yourfile.mdt",   cfile::moderead   );  
          carchive   ar(   &file,carchive::load   );  
          serialize(   ar   );  
          ar.close();  
          file.close();  
  }  
   
  这就是我们自己实现的序列化,也就是序列化的原理。  
  应该注意的是,carchive采用>>和<<来读写文件,其操作的数据如果是类,这个类必须从cobject派生,并声明为declare_serial,如果不从cobject派生,则需要实现>>和<<操作符,比如cstring不从cobject派生,但它实现了>>和<<操作符。对于结构体,你需要调用carchive::read/write来进行,对于简单数据类型可以直接使用>>和<<操作符。  
  另外,基于文档/视结构的mfc程序,其框架实现了上述序列化的savefiletodisk和readfilefromdisk(隐藏了),只提供了一个serialize()函数,你只需要在其中加入要序列化的变量。  
   
  以上是序列化的全过程。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值