• Serialize序列化函数(MFC)


    要实现一个能够序列化的类,必须要经过一下几步

    1.这个类必须间接火直接地由CObject派生而来

    2.定义一个不带参数的构造函数

    3.在头文件中,必须有如下声明:

    DECLARE_SERIAL( Your name of class)

    4.在源文件中开头有如下声明

    IMPLEMENT_SERIAL (Your nameofclass,CObject,1)

    其中的第三个参数代表版本号

    5.必须重载基类中的序列化函数Serialize

    经过以上五步,一个带有存储功能的类就诞生了

     

    序列化(Serialization)

    1、 序列化提出和定义

    序列化在面向对象的程序设计中出现的,它基于对象是可以连续的思想,在程序退出或者启动的时候,可以把对象顺序的存储在磁盘或者从磁盘读出,存储和读出对象的过程叫做序列化。

    2、 序列化存储的应用和局限

         序列化存储可以把对象存储到磁盘上,但它并不能代替数据库设计的信息存储,因为它只是顺序的存取,没有检索机制。

    3、 序列化的类

    序列化的类可以直接或者间接从CObject类派生,类的声明中必须包含DECLARE_SERIAL宏调用,实现文件也必须有与之对应的宏:

    IMPLEMENT_SERIAL。(注意:DECLARE_SERIAL/IMPLEMENT_SERIAL包含了DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏)。

    4、 MFC中序列化的使用

    如果应用程序没有进行直接磁盘操作的输入输出,而是依靠序列化的过程,那么就不必直接使用CFile对象。MFC库中文档类的Serialize函数和CFile对象之间有一个CArchive对象。该对象为CFile对象缓冲数据并保持一个内部标志,来指明是存储或者加载对象。MFC应用程序框架负责CFile和Carchive对象构造及关联。在自动生成的菜单FileOpen和FileSave等过程中,应用程序框架会调用文档的Serialize函数,我们可以在该函数中处理特定类对象的序列化。

    下面是摘自vc技术内幕上的代码:

    void CStudentDoc::Serialize(CArchive&ar)

    {

      TRACE("Entering CStudentDoc::Serialize ");

    if (ar.IsStoring())

    {

          // TODO: add storing code here

    }

    else

    {

          // TODO: add loading code here

    }

      m_studentList.Serialize(ar);

    }

    MFC程序在打开或关闭文件操作的时候,会调用该函数。默认的该函数并没有对我们自己的数据(m_studentList)进行存取。我们在该函住中加入的最后一行代码序列化了我们的数据对象。当然这都需要我们自己编写自己数据类的Serialize函数。如下:(摘自vc技术内幕上的代码)

    void CStudent::Serialize(CArchive&ar)

    {

      TRACE("Entering CStudent::Serialize ");

       if(ar.IsStoring()) {

          ar << m_strName <<m_nGrade;

       }

       else {

          ar >> m_strName >>m_nGrade;

       }

    }

    文档串行化中的CArchive重载的操作符。ar<<其实就是向文件写入!操作符重载就不多说了。

    这里是MFC中关于永久保存机制的串行序列化操作。
    CArchive是windows中已经定义好的文档类。

    上述这段代码总体意思就是,当向ar保存数据时,把m_nType、m_strFileName、m_dwFileSize保存到ar中;当读取ar中数据时,把ar中的数据读取到m_nType、m_strFileName、m_dwFileSize中。

    <<与>>都已经被重载,不是原先的左右移的意思,而是序列化的方向,也就文件是保存还是读取。
    比如:ar << m_nType表示把m_nType信息序列化到ar中,也就是把m_nType信息保存到ar中;以此类推ar >> m_nType表示把ar中的信息序列化到m_nType,也就是写入m_nType中。
    IsStoring()是CArchive中成员函数,用于判断是读取数据,还是保存数据。

  • 相关阅读:
    基于Lucene 4.x的ikanalyzer
    scala实现HighCharts生成的SVG图像下载
    使用solrj和EasyNet.Solr进行原子更新
    Bootstrap 2.3.0自定Grid布局
    无法删除打印机Failed to remove driver ZDesigner ZT210300dpi ZPL. Failed to remove package zdesigner.inf. Driver package is in use.
    彩云披月镜,委蛇藏花芯。朝辞浮云晓,元初破日衣。
    python browser.find_element_by 方法过期browser.find_element_by_tag_name;browser.find_element_by_class_name;browser.find_element_by_id;browser.find_element_by_name;
    c++中按位取反
    typedef用法总结
    Visual C++开发工具与调试技巧整理
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256703.html
Copyright © 2020-2023  润新知