Cereal 是一个轻量级头文件-only 的 C++ 序列化库,支持二进制、JSON 和 XML 格式。1. 通过包含 cereal 头文件并定义 serialize 函数实现类的序列化;2. 使用 JSONOutputArchive/JSONInputArchive 进行 JSON 读写;3. 利用 BinaryOutputArchive/BinaryInputArchive 支持高效二进制序列化;4. 原生支持 STL 容器如 vector、map;5. 可通过非成员函数在 cereal 命名空间中实现非侵入式序列化;6. 注意使用 CEREAL_NVP 命名字段、避免裸指针、确保默认构造函数可用。

在C++中,对象序列化是将数据结构或对象状态转换为可存储或传输格式的过程。Cereal 是一个轻量级、头文件-only 的 C++ 序列化库,支持二进制、JSON 和 XML 格式,使用简单且无需依赖外部编译器。下面介绍如何使用 Cereal 实现对象的序列化与反序列化。
Cereal 是纯头文件库,无需编译,直接包含即可使用。
要使自定义类支持序列化,需在类内或类外定义 serialize 函数。
例如,定义一个 Person 类:person.hpp
立即学习“C++免费学习笔记(深入)”;
#include <string>
#include <cereal/access.hpp>
class Person {
private:
std::string name;
int age;
// 允许 cereal 访问私有成员
friend class cereal::access;
template<typename Archive>
void serialize(Archive& ar) {
ar( CEREAL_NVP(name), CEREAL_NVP(age) );
}
public:
Person() = default;
Person(std::string n, int a) : name(std::move(n)), age(a) {}
};
通过 cereal::access 友元声明,让 Cereal 能访问私有成员。使用 CEREAL_NVP 可以自动命名字段,在 JSON 或 XML 中更清晰。
将对象保存为 JSON 格式便于阅读和调试。
示例:序列化 Person 对象到文件save.cpp
#include "person.hpp"
#include <fstream>
#include <cereal/archives/json.hpp>
int main() {
Person p("Alice", 30);
std::ofstream os("person.json");
cereal::JSONOutputArchive archive(os);
archive(CEREAL_NVP(p));
return 0;
}
生成的 person.json 内容如下:
{
"p": {
"name": "Alice",
"age": 30
}
}
读取并恢复对象状态也很简单。
load.cpp
#include "person.hpp"
#include <fstream>
#include <cereal/archives/json.hpp>
int main() {
Person p;
std::ifstream is("person.json");
cereal::JSONInputArchive archive(is);
archive(p); // 注意:这里不需要 CEREAL_NVP
return 0;
}
执行后,p 对象将恢复为保存时的状态。
二进制格式更紧凑,适合高性能场景。
保存为二进制:
std::ofstream os("data.bin", std::ios::binary);
cereal::BinaryOutputArchive archive(os);
archive(p);
std::ifstream is("data.bin", std::ios::binary);
cereal::BinaryInputArchive archive(is);
archive(p);
Cereal 原生支持大多数 STL 容器,如 vector、map、unordered_set 等。
std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}};
// 序列化整个容器
archive(CEREAL_NVP(people));
可以直接序列化包含容器的类,无需额外处理。
如果无法修改类定义,可以使用非成员函数方式。
namespace cereal {
template<typename Archive>
void serialize(Archive& ar, Person& p) {
ar( CEREAL_NVP(p.name), CEREAL_NVP(p.age) );
}
}
将 serialize 定义在 cereal 命名空间中,效果等同于类内实现。
以上就是C++如何使用Cereal库进行对象序列化_C++序列化库Cereal使用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号