打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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& ar, CStudent*& pOb)
{
pOb=(CStudent*)ar.ReadObject(RUNTIME_CLASS(CStudent));
return ar;
}
CObject* PASCAL CStudent::CreateObject()
{
return new CStudent;
}
_IMPLEMENT_RUNTIMECLASS(CStudent,CObject,1,CStudent::CreateObject);
AFX_CLASSINIT _init_CStudent(RUNTIME_CLASS(CStudent));
void ObjStore(CStudent&stu)
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
ar<<&stu;
ar.Close();
file.Close();
}
void ObjLoad()
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeRead);
CArchive ar(&file,CArchive::load);
CStudent *pStu=NULL;
ar>>pStu;
ar.Close();
if (pStu)
{
pStu->Show();
}
}
void main()
{
CStudent stu(L"ZhangShan",18);
ObjStore(stu);//对象的序列化
ObjLoad();//对象的反序列化
}
/*
class CStudent
...
_DECLARE_DYNCREATE(CStudent)//动态创建宏
AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar,CStudent* &pOb);
1.operator>>-创建类的对象并读取数据
2._init_CStudent-变量展开后是一个函数AfxClassInit,将CStudent的运行时类信息保存到程序的模块中m_classList
3.序列化的过程
1> 获取对象的运行时类信息:  CRuntimeClass* pClassRef    = pOb->GetRuntimeClass();
2> 将类的版本和名称写入到Archive对象中WriteClass(pClassRef);调用 pClassRef->Store(*this);,在函数中,将类的版本、大小、名称保存到Archive对象
3> 调用对象的Serialize函数((CObject*)pOb)->Serialize(*this);
4> 在Serialize函数中,将对象的数据保存到Archive对象中   ar<<m_strName<<m_nAge;
4.反序列化的过程
1> _init_CStudent变量将类的运行时类信息保存到应用程序中。
2> 从文件中读取类的名称和版本ReadClass函数,调用pClassRef = CRuntimeClass::Load(*this, &nSchema)在函数中,从Archive对象读取类的版本、大小   和名称。
3> 使用从文件中读取的类的名称,在程序的链表m_classList中,去查找类的运行时信息
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
for (pClass = pModuleState->m_classList; pClass != NULL;pClass = pClass->m_pNextClass)
{
if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
{
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
return pClass;
}
}
4> ReadClass函数执行完毕后,调用CreateObject函数     pOb = pClassRef->CreateObject();调用宏展开后的函数,创建CStudent类的对象
5> 调用对象的Serialize函数 pOb->Serialize(*this);
6> 在Serialize函数中,读取对象的数据 ar>>m_strName>>m_nAge;
*/
//新建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& ar, CStudent*& pOb)
{
pOb=(CStudent*)ar.ReadObject(RUNTIME_CLASS(CStudent));
return ar;
}
CObject* PASCAL CStudent::CreateObject()
{
return new CStudent;
}
_IMPLEMENT_RUNTIMECLASS(CStudent,CObject,1,CStudent::CreateObject);
AFX_CLASSINIT _init_CStudent(RUNTIME_CLASS(CStudent));
void ObjStore(CStudent&stu)
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
ar<<&stu;
ar.Close();
file.Close();
}
void ObjLoad()
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeRead);
CArchive ar(&file,CArchive::load);
CStudent *pStu=NULL;
ar>>pStu;
ar.Close();
if (pStu)
{
pStu->Show();
}
}
void main()
{
CStudent stu(L"ZhangShan",18);
ObjStore(stu);//对象的序列化
ObjLoad();//对象的反序列化
}
/*
class CStudent
...
_DECLARE_DYNCREATE(CStudent)//动态创建宏
AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar,CStudent* &pOb);
1.operator>>-创建类的对象并读取数据
2._init_CStudent-变量展开后是一个函数AfxClassInit,将CStudent的运行时类信息保存到程序的模块中m_classList
3.序列化的过程
1> 获取对象的运行时类信息:  CRuntimeClass* pClassRef = pOb->GetRuntimeClass();
2> 将类的版本和名称写入到Archive对象中WriteClass(pClassRef);调用 pClassRef->Store(*this);,在函数中,将类的版本、大小、名称保存到Archive对象
3> 调用对象的Serialize函数((CObject*)pOb)->Serialize(*this);
4> 在Serialize函数中,将对象的数据保存到Archive对象中   ar<<m_strName<<m_nAge;
4.反序列化的过程
1> _init_CStudent变量将类的运行时类信息保存到应用程序中。
2> 从文件中读取类的名称和版本ReadClass函数,调用pClassRef = CRuntimeClass::Load(*this, &nSchema)在函数中,从Archive对象读取类的版本、大小 和名称。
3> 使用从文件中读取的类的名称,在程序的链表m_classList中,去查找类的运行时信息
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
for (pClass = pModuleState->m_classList; pClass != NULL;pClass = pClass->m_pNextClass)
{
if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
{
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
return pClass;
}
}
4> ReadClass函数执行完毕后,调用CreateObject函数  pOb = pClassRef->CreateObject();调用宏展开后的函数,创建CStudent类的对象
5> 调用对象的Serialize函数 pOb->Serialize(*this);
6> 在Serialize函数中,读取对象的数据 ar>>m_strName>>m_nAge;
*/运行结果:
原文请查看:http://www.2cto.com/kf/201304/202442.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
序列化函数Serialize()
MFC文档序列化实现保存和加载
VC序列化问题(Serialize)
MFC的Serialize机制及其使用
CArchive
6.3.4 使用MFC::CArchive - 笔记 - 白乔 - CSDN学生大本营 -...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服