zoukankan      html  css  js  c++  java
  • VC++ MFC如何生成一个可串行化的类

    一、MFC允许对象在程序运行的整个过程中持久化的串行化机制
    (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程。
    (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构)的状态。
    (3)MFC支持CObject类中的串行化,所以,所有继承于CObject的类可以利用CObject的串行化协议。
    (4)串行化的基本思想:
              a、对象必须能将其当前状态写入到持久化存储媒介中,通常用其成员变量实现。
              b、对象可以通过读或反序列化从存储媒介中重新构造对象的状态。
              c、串行化处理所有对象指针的细节,以及序列化对象时对对象的循环引用。
              d、关键点是对象自己负责读和写其本身的状态,所以,序列化一个对象时,必须是想基本的序列化操作。
    (5)MFC使用CArchive类的对象作为被序列化的对象和存储媒介之间的中间媒介。
    二、生成一个可串行化的类的步骤
    (1) Derive your class from CObject. (定义一个基类为CObject的类)
    (2) Override the Serialize member function.(重写串行化函数)
    (3) Use the DECLARE_SERIAL macro in the class declaration.(在类声明文件中使用DECLARE_SERIAL宏)
    (4) Define a constructor with no arguments (a default constructor).(定义一个无参数的构造函数)
    (5) Use the IMPLEMENT_SERIAL macro in the class implementation file.(在实现文件中使用IMPLEMENT_SERIAL宏)
    三、实例

    Graph.h文件:

    #pragma once  
      
    // Graph 命令目标  
      
    class Graph : public CObject  //(1)定义一个基类为COject的类  
    {  
        DECLARE_SERIAL(Graph)  //(3)在类声明文件中使用DECLARE_SERIAL宏  
    public:  
        Graph(); //(4)定义一个无参数的构造函数  
        Graph(int drawType, CPoint ptOld);  
        virtual ~Graph();  
      
        void Serialize(CArchive &ar); //(2)重写串行化函数  
      
    private:  
        int m_drawType;  
        CPoint m_ptOld;  
    };
    Graph.cpp文件:

    // Graph.cpp : 实现文件 
    // 
     
    #include
    "stdafx.h" 
    #include
    "Archive.h" 
    #include
    "Graph.h" 
     
     
    // Graph 
     
    IMPLEMENT_SERIAL(Graph, CObject,
    1) //(5)在实现文件中使用IMPLEMENT_SERIAL宏 
     
    Graph::Graph()
    //(4)定义一个无参数的构造函数 


     
    Graph::Graph(
    int drawType, CPoint ptOld) 

       
    this->m_drawType = drawType; 
       
    this->m_ptOld = ptOld; 

     
    Graph::
    ~Graph() 


     
    // Graph 成员函数 
    void Graph::Serialize(CArchive &ar) //(2)重写串行化函数 

       
    if (ar.IsStoring()) 
        { 
            ar
    <<m_drawType<<m_ptOld; 
        } 
       
    else 
        { 
            ar
    >>m_drawType>>m_ptOld; 
        } 
    }

    如此之后,即可实现串行化类

  • 相关阅读:
    May 24th 2017 Week 21th Wednesday
    May 23rd 2017 Week 21st Tuesday
    全球顶尖大学的UX课程资源,英文!
    如何设计出一款出色的结账表单
    快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
    界面设计中如何增强CTA按钮召唤力?
    10个实用的UX设计作品推销小窍门
    UX术语详解:任务流,用户流,流程图以及其它全新术语
    让你不再恋家的9款小众时尚的酒店网站设计
    聊聊原型设计中的团队管理功能
  • 原文地址:https://www.cnblogs.com/lujin49/p/4669846.html
Copyright © 2011-2022 走看看