当前位置:编程学习 > C/C++ >>

MFC序列化

 概述
1.序列化概念:采用数据流的方式,将数据依次写入或者读取文件。是二进制的存储方式。

2.序列化相关类:CFile(文件类);CArchive(封装了序列化操作,完成数据读写的具体操作);CObject中与序列化相关的两个函数,CObject::Serialize()数据读写的虚函数;CObject::IsSerializable()判断是否支持序列化。

3.序列化的使用:

       1>创建或者打开文件 CFile::Open() 

       2>定义CArchive对象

       3>使用CArchive对象进行写(存储”<<”)或者读(加载”>>”);同一个文件的数据存储和加载的顺序和类型必须一致

       4>关闭CArchive对象 CArchive::Close()

       5>关闭文件 CFile::Close()

4.对象的序列化和反序列化

对象的序列化——将对象的类的信息以及类中的数据保存到文件中的过程。

对象的反序列化——根据读取的类的信息,创建对象,并将对象的数据读入的过程。

使用过程:

   (1).定义支持序列化的类

         1>继承自CObject

         2>重写CObject类的Serialize()函数

         3>在类的定义中添加宏  DECLARE_SERIAL

         4>在类的实现中添加宏 IMPLEMENT_SERIAL

   (2).创建或者打开文件 CFile::Open() 

   (3).定义CArchive对象 

   (4).将类的对象保存到CArchive对象中,或者从CArchive对象读取

   (5).关闭CArchive对象 CArchive::Close()

   (6).关闭文件 CFile::Close()

5.对象的序列化带来的好处

     1>   以某种存储形式使自定义对象持久化;

     2>   将对象从一个地方传递到另一个地方。

     3>   使程序更具维护性。

实例
序列化实例

[cpp]
//新建MFC的MFCSerialize工程,删除掉自动生成的文件,并设置 属性->链接器->系统->子系统  控制台 (/SUBSYSTEM:CONSOLE)  
// MFCSerialize.cpp : 定义应用程序的类行为。   
#include "stdafx.h"   
CWinApp the; 
using namespace std; 
void Store()//写操作,存储  

    CFile file; 
    if (!file.Open(L"c:\\serial.data",CFile::modeCreate|CFile::modeWrite)) 
    { 
        return; 
    } 
    CArchive ar(&file,CArchive::store);//定义CArchive对象  
    try 
    { 
        //执行写操作  
        ar<<100<<12.25; 
        CString strData=L"Hello CArchive"; 
        ar<<strData; 
    }  
    catch (CException* e) 
    { 
    } 
    ar.Close(); 
    file.Close(); 

void Load()//读操作,加载  

    CFile file; 
    if (!file.Open(L"c:\\serial.data",CFile::modeRead)) 
    { 
        return; 
    } 
    CArchive ar(&file,CArchive::load); 
    int num=0; 
    double fNum=0.0f; 
    CString strData=L""; 
    ar>>num>>fNum>>strData;  
    ar.Close(); 
    file.Close(); 
    wprintf(L"nNum=%d; fNum=%.2f; %s\n",num,fNum,strData); 

void main() 

    Store(); 
    Load(); 

//新建MFC的MFCSerialize工程,删除掉自动生成的文件,并设置 属性->链接器->系统->子系统  控制台 (/SUBSYSTEM:CONSOLE)
// MFCSerialize.cpp : 定义应用程序的类行为。
#include "stdafx.h"
CWinApp the;
using namespace std;
void Store()//写操作,存储
{
 CFile file;
 if (!file.Open(L"c:\\serial.data",CFile::modeCreate|CFile::modeWrite))
 {
  return;
 }
 CArchive ar(&file,CArchive::store);//定义CArchive对象
 try
 {
  //执行写操作
  ar<<100<<12.25;
  CString strData=L"Hello CArchive";
  ar<<strData;
 }
 catch (CException* e)
 {
 }
 ar.Close();
 file.Close();
}
void Load()//读操作,加载
{
 CFile file;
 if (!file.Open(L"c:\\serial.data",CFile::modeRead))
 {
  return;
 }
 CArchive ar(&file,CArchive::load);
 int num=0;
 double fNum=0.0f;
 CString strData=L"";
 ar>>num>>fNum>>strData;
 ar.Close();
 file.Close();
 wprintf(L"nNum=%d; fNum=%.2f; %s\n",num,fNum,strData);
}
void main()
{
 Store();
 Load();
}运行结果:

\

对象序列化实例

[cpp]
//新建MFC的MFCObject工程,删除掉自动生成的文件,并设置 属性->链接器->系统->子系统  控制台 (/SUBSYSTEM:CONSOLE)  
// MFCObject.cpp : 定义应用程序的类行为。   
#include "stdafx.h"    
CWinApp theApp; 
using namespace std; 
//定义支持序列化得类  
class CStudent:public CObject 

public: 
    CStudent(){} 
    CStudent(CString name,int age); 
    void Show(); 
    virtual void Serialize(CArchive& ar); 
    _DECLARE_DYNCREATE(CStudent) //动态创建宏  
    AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, CStudent*& pOb); 
private: 
    CString m_strName; 
    int m_nAge; 
}; 
CStudent::CStudent(CString name,int age) 

    m_strName=name; 
    m_nAge=age; 

void CStudent::Show() 
{  
    printf("学员信息:%S,%d\n",m_strName,m_nAge);//大写'S'在ansi中,代表后面是unic字符串    

void CStudent::Serialize(CArchive& ar) 

    if (ar.IsStoring()) 
    { 
        ar<<m_strName<<m_nAge; 
    } 
    else 
    { 
        ar>>m_strName>>m_nAge; 
    } 

CArchive& AFXAPI operator>>(CArchive&

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,