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


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

立即学习“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 对象到文件

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 内容如下:

Manus Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

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


# 第三方  # seo如何制作  # 适合游戏推广的素材网站  # 包装推广营销策略研究  # 焦作网站营销推广技巧  # 网站制作推广办事效率高  # 伊春seo创业培训班  # 湖北网站优化推广  # 赣州什么是整合营销推广  # 阳江物流公司网站建设  # 营销网站建设苏州  # 不需要  # 就能  # 保存为  # 如何将  # js  # 头文件  # 是一个  # 数据结构  # 如何使用  # 序列化  # red  # stream  # ios  # c++  # ai  # access  # github  # json  # git 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Word 2003字体大小设置方法  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  4399小游戏下装链接 4399小游戏下载链接入口  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  知音漫客官网首页入口_知音漫客热门漫画推荐  mysql如何配置从库只读_mysql从库只读设置方法  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  微信步数怎么刷_微信步数快速提升技巧  139邮箱登录入口官网 139邮箱登录入口官网网址  《合金装备4》有望推出重制版!制作人发话了  阿里云共享相册入口在哪  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  视频转蓝光m2ts格式  抖音团长模式怎么做?团长模式是什么意思?  123网页端官方登录页 123邮箱网页版即时通讯服务  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  《一起考教师》账号注销方法  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  J*a实现任务清单管理_集合框架综合入门练手  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  路由器DNS怎么设置最快 优化DNS提升上网速度教程  《单词速记宝》设置学习计划方法  《撕歌》会员开通方法  智慧职教mooc平台登录网址 智慧职教mooc官网直达  睡觉时心跳快是什么原因 夜间心悸如何应对  解决VS Code中Python版本冲突与输出异常的指南  如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧  poki官网最新入口 poki小游戏大全入口  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  电子白板帮助菜单使用指南  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  J*aScript调试技巧_性能分析与内存快照  繁花漫画使用教程  sublime text 4如何安装_最新版sublime下载与汉化教程  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  批改网网页版登录 批改网电脑版学生登录入口  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  Win10输入法不见了怎么办 Win10找回语言栏图标教程  todesk如何添加信任设备_todesk信任设备设置教程  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  之了课堂app做题入口  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.