C++ 对象序列化:库、方法与代码示例

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

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

开始课程

C++ 对象序列化:完全指南



序列化是将复杂数据结构(类对象、容器)转换为连续格式(字节流、JSON 字符串、XML)的过程,该格式适合保存到文件或通过网络传输。逆过程——反序列化——则从该格式恢复对象。在缺乏内置反射机制的 C++ 中,序列化需要手动描述或使用专门的库。本文将介绍 C++ 中序列化的主要方法和最佳工具。



为什么需要序列化?

  • 状态保存 —— 游戏存档、应用程序设置记录。
  • 网络通信 —— 客户端与服务器之间的对象传输。
  • 缓存 —— 将计算结果保存到文件。
  • 数据交换 —— 与其他语言集成(JSON、Protobuf)。


流行的 C++ 序列化库



1. Boost.Serialization

来自 Boost 库的经典库。支持二进制、文本和 XML 序列化。需要显式添加 serialize 或 save/load 方法。



#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <fstream>

class Person {public: std::string name; int age; template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar & name; ar & age; }};

// 保存void save(const Person& p) { std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa << p;}

// 加载Person load() { Person p; std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> p; return p;}


2. Cereal

现代轻量级库(仅头文件)。支持 JSON、XML、二进制格式。无需继承基类。非常适合不需要整个 Boost 库的项目。



#include <cereal/archives/json.hpp>#include <cereal/types/string.hpp>#include <cereal/types/vector.hpp>#include <fstream>

struct Student { std::string name; std::vector<int> grades; template<class Archive> void serialize(Archive& ar) { ar(CEREAL_NVP(name), CEREAL_NVP(grades)); }};

// 保存为 JSONvoid saveStudent(const Student& s) { std::ofstream ofs("student.json"); cereal::JSONOutputArchive archive(ofs); archive(CEREAL_NVP(s));}

// 从 JSON 加载Student loadStudent() { Student s; std::ifstream ifs("student.json"); cereal::JSONInputArchive archive(ifs); archive(s); return s;}


3. nlohmann/json(现代 C++ 的 JSON 库)

严格来说并非传统意义上的序列化库,但可以轻松地将对象转换为 JSON 并恢复。需要手动编写转换函数。



#include <nlohmann/json.hpp>using json = nlohmann::json;

struct Point { int x, y;};

void to_json(json& j, const Point& p) { j = json{{"x", p.x}, {"y", p.y}};}

void from_json(const json& j, Point& p) { j.at("x").get_to(p.x); j.at("y").get_to(p.y);}

// 使用Point p1{10, 20};json j = p1; // 序列化Point p2 = j.get<Point>(); // 反序列化


4. Protocol Buffers (protobuf)

由 Google 开发。需要在 .proto 文件中描述结构,然后生成 C++ 代码。提供紧凑的二进制格式和高速度。



// 文件 person.protosyntax = "proto3";message P                    

推荐