cereal for C++: 完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 cereal,为什么需要它?

\n\n

cereal 是一个轻量级的、仅头文件的 C++ 数据序列化库。它允许将复杂的数据结构(类、结构体、STL 容器)转换为 JSON、XML 和 二进制格式 等格式,然后再将它们恢复回来。这对于保存程序状态、通过网络传输数据、记录日志或在不同编程语言之间交换信息至关重要。

\n\n

与更重量级的解决方案(例如 Boost.Serialization)不同,cereal 不需要预编译或复杂的配置。它完全由头文件组成,从而简化了在任何项目中的集成。主要优点:

\n
    \n
  • 仅头文件: 无需单独编译库。
  • \n
  • 支持 C++11/14/17: 使用现代语言特性。
  • \n
  • 灵活性: 支持自定义类型、智能指针、多态。
  • \n
  • 性能: 二进制格式非常快速且紧凑。
  • \n
\n\n

安装

\n\n

由于 cereal 是一个仅头文件的库,安装只需将头文件复制到您的项目中。C++ 不需要 pip install 或 npm install。以下是两种主要方法:

\n\n

方法 1:手动安装(推荐用于学习)

\n
    \n
  1. 从 GitHub 下载最新版本(绿色 "Code" 按钮 → "Download ZIP")。
  2. \n
  3. 解压存档。
  4. \n
  5. 将 include/cereal 文件夹复制到您的项目文件夹中。
  6. \n
  7. 在代码中引入:#include "cereal/cereal.hpp"。
  8. \n
\n\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:

\n\n
#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

主要方法和函数

\n\n

以下是库的关键元素。所有示例均假定已包含 #include <cereal/cereal.hpp> 和相应的存档头文件。

\n\n

1. cereal::JSONOutputArchive

\n

功能: 创建一个用于将数据写入

推荐