学习笔记01-序列化与反序列化
前言
百度了一下关于序列化和反序列化的文章,大多都是在Java下讨论的,我的老师教我的是在C/C++中实现手工序列化/反序列化,以及调用MFC中的序列化/反序列化框架。
初一看,序列化和反序列化,从字面上很不好理解,感觉好深奥哦,晦涩难懂、望而生畏,然而我的老师举了个例子就豁然开朗了:你玩过游戏不?经历过游戏没存档,又要重玩儿的痛苦不?
这里:
序列化就理解为“存档”-内存中的对象写入到文件的过程;
反序列化就理解为“读档”-文件中的对象读入到内存的过程。
好理解了吧。
手工序列化(serialize)
最简单的序列化C/C++实现思路
1.定义一个类
class CA
{
public:
CA() {};//默认构造
CA(string strString, int Val) :m_strString(strString),m_nVal(Val){}//初始化列表
//序列化公有成员函数
void Serialize(fstream& fs)
{
fs << m_strString;
fs.write((char*)&m_nVal, sizeof(m_nVal));
}
private:
string m_strString;//字符串类型私有数据成员
int m_nVal; //整形私有数据成员
};
2.实例化类对象,并写入文件
void Serialize()
{
//实例化类对象
CA a1("aaaaaaaa", 1);
CA b1("bbbbbbbb", 2);
CA c1("cccccccc", 3);
//打开文件
fstream fs;
fs.open("serialize.data", ios::in | ios::out | ios::trunc);
if (!fs.is_open())
{
cout << "无法打开文件" << endl;
return;
}
int nObjCnt = 3;
fs.write((char*)&nObjCnt, sizeof(nObjCnt));
//调用序列化函数将类对象写入文件
a1.Serialize(fs);
b1.Serialize(fs);
c1.Serialize(fs);
//关闭文件
fs.close();
}