首页 > 后端开发 > C++ > 正文

C++如何使用Cereal库进行对象序列化_C++序列化库Cereal使用指南

穿越時空
发布: 2025-11-15 19:57:19
原创
938人浏览过
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库进行对象序列化_c++序列化库cereal使用指南

在C++中,对象序列化是将数据结构或对象状态转换为可存储或传输格式的过程。Cereal 是一个轻量级、头文件-only 的 C++ 序列化库,支持二进制、JSON 和 XML 格式,使用简单且无需依赖外部编译器。下面介绍如何使用 Cereal 实现对象的序列化与反序列化。

安装与配置 Cereal

Cereal 是纯头文件库,无需编译,直接包含即可使用。

  • 从 GitHub 下载:https://github.com/USCiLab/cereal
  • 将 cereal 源码目录(include/cereal)添加到项目包含路径
  • 在代码中通过 #include <cereal/archives/json.hpp> 等引入所需模块

基本类的序列化实现

要使自定义类支持序列化,需在类内或类外定义 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 文件

将对象保存为 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 内容如下:

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台
{
    "p": {
        "name": "Alice",
        "age": 30
    }
}
登录后复制

从 JSON 文件反序列化

读取并恢复对象状态也很简单。

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);
登录后复制

序列化 STL 容器

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 命名空间中,效果等同于类内实现。

注意事项与技巧

  • 确保构造函数为 public,即使为空(default 即可)
  • 序列化类型必须支持对应存档格式(如 XML 不支持指针)
  • 使用版本控制可应对类结构变更(通过 versioning 支持)
  • 避免序列化裸指针,推荐使用智能指针或值对象
基本上就这些。Cereal 使用现代 C++ 特性(模板、SFINAE)实现了简洁高效的序列化机制,适合大多数项目需求。只要正确声明 serialize 方法,就能轻松实现对象持久化。

以上就是C++如何使用Cereal库进行对象序列化_C++序列化库Cereal使用指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号