什么是 cereal,为什么需要它?
\n\ncereal 是一个轻量级的、仅头文件的 C++ 数据序列化库。它允许将复杂的数据结构(类、结构体、STL 容器)转换为 JSON、XML 和 二进制格式 等格式,然后再将它们恢复回来。这对于保存程序状态、通过网络传输数据、记录日志或在不同编程语言之间交换信息至关重要。
\n\n与更重量级的解决方案(例如 Boost.Serialization)不同,cereal 不需要预编译或复杂的配置。它完全由头文件组成,从而简化了在任何项目中的集成。主要优点:
\n- \n
- 仅头文件: 无需单独编译库。 \n
- 支持 C++11/14/17: 使用现代语言特性。 \n
- 灵活性: 支持自定义类型、智能指针、多态。 \n
- 性能: 二进制格式非常快速且紧凑。 \n
安装
\n\n由于 cereal 是一个仅头文件的库,安装只需将头文件复制到您的项目中。C++ 不需要 pip install 或 npm install。以下是两种主要方法:
方法 1:手动安装(推荐用于学习)
\n- \n
- 从 GitHub 下载最新版本(绿色 "Code" 按钮 → "Download ZIP")。 \n
- 解压存档。 \n
- 将
include/cereal文件夹复制到您的项目文件夹中。 \n - 在代码中引入:
#include "cereal/cereal.hpp"。 \n
方法 2:通过包管理器 vcpkg
\n# 如果尚未安装 vcpkg,请先安装\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n.\\bootstrap-vcpkg.bat # Windows\n./bootstrap-vcpkg.sh # Linux/macOS\n\n# 安装 cereal\n.\\vcpkg install cereal # Windows\n./vcpkg install cereal # Linux/macOS\n\n# 在 CMakeLists.txt 中引入:\n# find_package(cereal CONFIG REQUIRED)\n# target_link_libraries(your_project PRIVATE cereal::cereal)\n\n\n快速入门及代码示例
\n\n让我们创建一个简单的 Person 结构体并将其序列化为 JSON。创建文件 main.cpp:
#include <iostream>\n#include <fstream>\n#include <string>\n#include <cereal/archives/json.hpp>\n#include <cereal/types/string.hpp>\n\nstruct Person {\n std::string name;\n int age;\n\n // cereal 必需的方法\n template<class Archive>\n void serialize(Archive& archive) {\n archive(name, age);\n }\n};\n\nint main() {\n Person p1{"Alice", 30};\n\n // 写入文件\n {\n std::ofstream file("person.json");\n cereal::JSONOutputArchive archive(file);\n archive(CEREAL_NVP(p1)); // CEREAL_NVP — 用于命名字段\n }\n\n // 从文件读取\n Person p2;\n {\n std::ifstream file("person.json");\n cereal::JSONInputArchive archive(file);\n archive(p2);\n }\n\n std::cout << "Name: " << p2.name << ", Age: " << p2.age << std::endl;\n return 0;\n}\n\n\n编译:g++ -std=c++11 main.cpp -o main。运行后,将生成文件 person.json,内容为 {"p1": {"name": "Alice", "age": 30}}。
主要方法和函数
\n\n以下是库的关键元素。所有示例均假定已包含 #include <cereal/cereal.hpp> 和相应的存档头文件。
1. cereal::JSONOutputArchive
\n功能: 创建一个用于将数据写入