MFC序列化
来源:互联网 发布:荆门第四届网络作文 编辑:程序博客网 时间:2024/06/15 15:23
概述
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> 使程序更具维护性。
实例
序列化实例
//新建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的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_classList3.序列化的过程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序列化(转)(
- [MFC]对象序列化
- MFC文档序列化
- MFC对象序列化
- MFC 序列化总结
- MFC序列化
- MFC序列化
- MFC之序列化
- MFC序列化
- MFC文档序列化
- MFC序列化Serialize
- MFC中的类序列化
- MFC文档序列化内幕
- MFC文档序列化内幕
- MFC 序列化再理解
- MFC 序列化一点研究
- MFC序列化和反序列化
- MFC串行化(即序列化Serialization)
- Consistent Hash
- SVN 打基线
- Android测试用例执行线程和UI线程
- linux下如何设置用户密码过期时间
- Ubuntu server 12.04 install matlab
- MFC序列化
- 黑马程序员——>第五天<面向对象(匿名对象-封装-构造代码块-this关键字)>
- android 创建webview悬浮窗口
- 更好理解贝叶斯定律(Bayes Law)和卡曼滤波器(Kalman Filter)原理
- 修改/etc/fstab文件后无法登录系统
- android199-传递序列化对象
- Intel--巧用Media SDK检查系统硬件加速
- 软件数据库移植及数据表设计
- TCP数据包重组实现分析