C++ 序列化反序列化众多方式中的两种(自带、Cereal)
摘要:本文举例说明两种序列化方式,第一种是使用自带的文件操作库ifstream
对类进行二进制序列化及反序列化;第二种采用轻量级的Cereal对类进行序列化及反序列化。
目录
一、 两种方式简单对比
- 使用
fstream
的二进制序列化方式只能支持基本类型,对STL等无法操作 - Cereal的方式对基本类型和STL等类型都能实现,而且不止能二进制序列化,也能序列化为Json、xml等格式。
二、 Cereal获取
三、 fstream 方式
请注意,此方式类中全部变量只能是基本类型,否则会出错。
1. 需用添加头文件
#include <fstream>
2. 二进制序列化写入文件
template<typename T>
static int WriteBinary(const char *filePath, T &object)
{
// 创建文件输出流
std::ofstream ofs;
// 以输出二进制的方式打开文件,如果文件不存在则新建一个文件
// 如果文件已经存在则会清空内容
ofs.open(filePath, std::ios::out | std::ios::binary);
// 判断文件是否打开成功
if (!ofs.is_open())
{
std::cout << "open failed" << std::endl;
return 1;
}
// 将对象序列化后写入到文件中并保存
ofs.write((const char *)&object, sizeof(T));
// 关闭文件
ofs.close();
return 0;
}
3. 文件读取
template<typename T>
static int ReadBinary(const char *filePath, T &object)
{
// 创建文件输入流
std::ifstream ifs;
// 以输入二进制的方式打开文件
ifs.open(filePath, std::ios::in | std::ios::binary);
if (!ifs.is_open())
{
std::cout << "open failed" << std::endl;
return 1;
}
ifs.read((char *)&object, sizeof(T));
ifs.close();
return 0;
}
四、 Cereal 方式
本文只介绍二进制和Json方式,其他方式类似,可参考官方文档
在使用此方法之前,需要序列化的类中添加特定的一段代码,如下:
public:
template<class Archive>
void serialize(Archive &ar)