0

0

c++如何使用Cereal库进行序列化_c++现代化的序列化库【教程】

冰火之心

冰火之心

发布时间:2025-12-30 14:57:23

|

496人浏览过

|

来源于php中文网

原创

Cereal序列化核心三步:引入头文件、定义serialize函数、选JSON/Binary/XML存档;它轻量纯头文件、无需预编译,支持容器/智能指针/版本控制/继承。

c++如何使用cereal库进行序列化_c++现代化的序列化库【教程】

使用 Cereal 库进行 C++ 序列化,核心就三步:引入头文件、定义序列化函数、选择存档类型(JSON / Binary / XML)来读写。它轻量、头文件仅依赖、无需预编译或 IDL,是现代 C++ 项目中非常自然的序列化方案。

1. 快速接入 Cereal

Cereal 是纯头文件库,直接下载 red">cereal/include/cereal 目录,加到项目 include 路径即可。CMake 中可这样引入:

include_directories(${CMAKE_SOURCE_DIR}/third_party/cereal/include)

无需链接任何库,也不需要生成代码 —— 它靠 C++ 模板和 ADL(参数依赖查找)自动发现序列化逻辑。

2. 为自定义类添加序列化支持

最常用方式是在类内部或外部定义 serialize 成员函数或非成员函数,签名固定为:template void serialize(Archive& ar)

立即学习C++免费学习笔记(深入)”;

例如:

struct Person {
    std::string name;
    int age = 0;

    template
    void serialize(Archive& ar) {
        ar(CEREAL_NVP(name), CEREAL_NVP(age));
    }
};

CEREAL_NVP 是“命名变量包装器”,用于 JSON/XML 输出时保留字段名;二进制存档中可省略,直接写 ar(name, age) 也行。

若不想改类定义,也可用外部非成员函数(需声明为 friend 或放在同命名空间):

template
void serialize(Archive& ar, Person& p) {
    ar(CEREAL_NVP(p.name), CEREAL_NVP(p.age));
}

3. 选择存档类型并读写数据

Cereal 提供三种主流存档:

Proface Avatarize
Proface Avatarize

一个利用AI技术提供高质量专业头像和头像的工具

下载
  • BinaryArchive:最快、体积最小,跨平台但不兼容不同字节序(通常本地用没问题)
  • JSONArchive:人类可读、跨语言友好,支持嵌套、注释(需开启宏),默认带字段名
  • XMLOutputArchive / XMLInputArchive:结构清晰,适合配置文件场景,但较冗余

写入示例(JSON):

std::ofstream os("person.json");
cereal::JSONOutputArchive ar(os);
ar(CEREAL_NVP(p)); // p 是 Person 实例

读取示例(自动推导类型):

std::ifstream is("person.json");
cereal::JSONInputArchive ar(is);
Person p2;
ar(CEREAL_NVP(p2));

4. 处理常见情况的小技巧

容器与智能指针:std::vector、std::map、std::unique_ptr 等开箱即用,无需额外定义(只要元素类型可序列化)。

版本控制:用 CEREAL_CLASS_VERSION(MyClass, 2) 声明版本,在 serialize 中用 ar(cereal::make_nvp("field", field)) + 条件逻辑做兼容。

忽略字段:用 cereal::make_nvp("ignored", cereal::binary_data(...)) 或更推荐——在 serialize 中跳过该字段(只读/写时条件判断)。

继承支持:基类需有虚析构函数,并在 serialize 中显式调用 ar(cereal::base_class(this))

基本上就这些。Cereal 不复杂但容易忽略细节:比如忘记加 template、误用 const 导致无法写入、或 JSON 读取前没检查文件是否存在。用熟之后,它比 Boost.Serialization 更清爽,比手写 JSON 解析更安全。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

402

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

306

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1851

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2080

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

919

2024.11.28

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

518

2023.09.20

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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