1、定义
序列化在面向对象的程序设计中出现的,它基于对象是可以连续的思想,在程序退出或者启动的时候,可以把对象顺序的存储在磁盘或者从磁盘读出,存储和读出对象的过程叫做序列化。
2、使用
要实现一个能够序列化的类,必须要经过一下几步
- 1.这个类必须间接火直接地由CObject派生而来
- 2.定义一个不带参数的构造函数
- 3.在头文件中,必须有如下声明:DECLARE_SERIAL( Your name of class)
- 4.在源文件中开头有如下声明:IMPLEMENT_SERIAL (Your name of class,CObject,1)其中的第三个参数代表版本号
- 5.必须重载基类中的序列化函数Serialize
经过以上五步,一个带有存储功能的类就诞生了
3、实例
下面举一个简单的例子,假如有类CArwen,实例化一个对象,然后序列化该对象.最后反序列化,把保存的值再读出来初始化给一个对象.
头文件
#pragma once
#include "pch.h"
class CArwen : public CObject
{
DECLARE_SERIAL(CArwen)
public:
virtual void Serialize(CArchive& ar);
int age;
CString name;
};
cpp文件
#include "pch.h"
#include "CArwen.h"
//cpp文件
IMPLEMENT_SERIAL(CArwen, CObject, 1) //1是版本号,可以随便指定一个数值
void CArwen::Serialize(CArchive& ar)
{
if (ar.IsStoring()) { //序列化,保存信息
ar << age;
ar << name;
}
else //反序列化,读取信息
{
ar >> age;
ar >> name;
}
}
//写入
void CMFCApplication1Dlg::OnBnClickedOk()
{
CArwen arwen;
arwen.age = 24;
arwen.name = _T("weiwenhp");
CFile fi;
fi.Open(filePath, CFile::modeCreate | CFile::modeWrite); //如果文件不存在则创建一个,否则只是往文件写数据
CArchive ar(&fi, CArchive::store);
arwen.Serialize(ar); //序列化对象
ar.Close();
fi.Close();
}
//读取
void CMFCApplication1Dlg::OnBnClickedCancel()
{
CArwen arwen;
CFile fi;
fi.Open(filePath, CFile::modeRead);
CArchive ar(&fi, CArchive::load);
arwen.Serialize(ar); //反序列化对象
ar.Close();
fi.Close();
}
参考: