新闻中心

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

2025-11-15
浏览次数:
返回列表
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 json.hpp> 等引入所需模块

基本类的序列化实现

要使自定义类支持序列化,需在类内或类外定义 serialize 函数。

例如,定义一个 Person 类:

person.hpp

#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 对象到文件

s*e.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
    }
}

从 JSON 文件反序列化

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

Reachout.ai Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai

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使用指南的详细内容,更多请关注其它相关文章!


# 器中  # 加强外部营销推广力度  # 德州seo企业网站优化  # 公司网站与推广  # 高端网站建设加推广方案  # 宁河区外贸网站建设  # 亚马逊网站营销推广  # seo整站排名优化  # 承德商城网站推广哪家好  # 井冈山网站建设策划  # 优化网站方案  # 译为  # 保存为  # 如何将  # 并在  # js  # 头文件  # 是一个  # 数据结构  # 如何使用  # 序列化  # red  # stream  # ios  # c++  # ai  # access  # github  # json  # git 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  Win10双系统截图高效法 截屏快捷键速记【技巧】  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  必由学官方平台入口 必由学在线课堂登录地址  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  AO3网页版最新入口合集 Archive of Our Own在线访问指南  解决Tabulator日期时间排序问题的专业指南  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  Golang如何使用context实现超时取消_Golang context超时取消模式实践  CSS实现侧边栏导航项全宽圆角悬停背景效果  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Node.js中HTML按钮与J*aScript函数交互的正确姿势  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  抖音怎么赚钱_抖音创作者变现方法与途径指南  如何更改在 Excel 中打开超链接时的默认浏览器  Python:递归比较文件夹内容并找出特定类型文件的差异  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  J*aScript教程:根据元素文本内容动态设置背景色  Pygame教程:解决用户输入与游戏状态更新不同步问题  快手网页版在线登录 快手网页版官网入口快速访问  微博网页版官方账号登录 微博网页版内容浏览使用指南  excel怎么制作工资条 excel快速生成工资条的方法  铁路12306的积分有效期是多久_铁路12306积分有效期说明  小米汽车11月交付量突破40000台!雷军:将继续努力  Linux如何构建多环境配置管理_Linux多环境配置方案  解决Python logging 中 datefmt 导致时间戳固定不变的问题  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Archive of Our Own官网直达 AO3最新可用地址一览  Log4j Console Appender性能瓶颈与高并发优化策略  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  J*a应用程序首次运行自动创建文件与目录的最佳实践  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  夸克浏览器网页版最新地址 夸克浏览器官方入口合集 

搜索