MFC序列化 (一)

2014-11-24 03:07:17 · 作者: · 浏览: 3

概述
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< }
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< }
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_strN