c++如何用cereal库序列化 c++ header-only序列化【指南】
发布时间 - 2025-12-29 00:00:00 点击率:次cereal库是header-only的C++序列化方案,只需包含头文件;为自定义类型提供serialize成员函数或友元函数,并选择JSON/XML/Binary归档类型。
用 cereal 库做 C++ 序列化非常轻量,因为它完全是 header-only 的,无需编译安装,只需包含头文件就能用。核心在于为自定义类型提供 serialize 成员函数或友元函数,并选择合适的归档类型(如 JSONArchive、BinaryArchive 或 XMLArchive)。
1. 快速开始:引入 cereal 并序列化基础类型
cereal 不依赖外部
构建系统,下载单头文件 cereal/include/cereal/cereal.hpp(或通过 vcpkg/conan 安装),然后在代码中包含即可:
#include
#include
#include
cereal 已为常见 STL 类型(std::string、std::vector、std::map 等)提供了内置支持,无需额外声明。
2. 为自定义类添加序列化支持
对你的结构体或类,只需定义一个 serialize 成员函数(或使用 CEREAL_SERIALIZE_FUNCTION_NAME 宏),接受归档对象引用:
struct Person {
std::string name;
int age;
std::vector
template
void serialize(Archive& ar) {
ar(CEREAL_NVP(name), CEREAL_NVP(age), CEREAL_NVP(scores));
}
};
-
CEREAL_NVP 是“named value pair”,用于 JSON/XML 输出时保留字段名;二进制归档中可省略,直接写
ar(name, age, scores) - friend + 非成员
serialize函数实现
3. 实际保存与加载:选对归档类型
不同归档对应不同格式和用途,用法一致:
// 写入 JSON 文件
{
std::ofstream os("person.json");
cereal::JSONOutputArchive ar(os);
Person p{"Alice", 30, {95.5, 87.0}};
ar(CEREAL_NVP(p));
}
// 读回
{
std::ifstream is("person.json");
cereal::JSONInputArchive ar(is);
Person p;
ar(CEREAL_NVP(p));
}
- JSONArchive:人类可读,调试友好,但体积大、性能低
- BinaryArchive:紧凑高效,跨平台(小端序),适合本地存储或 IPC
- XMLArchive:结构清晰,兼容性强,但更冗长
- std::stringstream,方便内存中序列化/反序列化
4. 注意事项与实用技巧
cereal 简单但有几个关键点容易踩坑:
- cereal::base_class() 和宏
CEREAL_REGISTER_TYPE(启用运行时类型信息) - load_minimal/
save_minimal或load_and_construct控制细节 - find_package(cereal) 或
add_subdirectory引入
# js
# json
# ai
# c++
# String
# 成员函数
# include
# xml
# 结构体
# int
# double
# void
# class
# Struct
# map
# 对象
# ar
# 序列化
# 只需
# 自定义
# 头文件
# 有几个
# 因为它
# 已为
# 但更
# 不依赖
# 字段名
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何在企业微信快速生成手机电脑官网?
微信小程序 闭包写法详细介绍
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何快速搭建二级域名独立网站?
Laravel API资源类怎么用_Laravel API Resource数据转换
如何在腾讯云服务器上快速搭建个人网站?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
LinuxCD持续部署教程_自动发布与回滚机制
韩国服务器如何优化跨境访问实现高效连接?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何快速搭建高效WAP手机网站?
如何在自有机房高效搭建专业网站?
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel如何自定义分页视图?(Pagination示例)
php485函数参数是什么意思_php485各参数详细说明【介绍】
音响网站制作视频教程,隆霸音响官方网站?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Android 常见的图片加载框架详细介绍
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel如何使用Blade组件和插槽?(Component代码示例)
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何实现javascript表单验证_正则表达式有哪些实用技巧
jQuery validate插件功能与用法详解
如何解决hover在ie6中的兼容性问题
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
网易LOFTER官网链接 老福特网页版登录地址
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
网站页面设计需要考虑到这些问题
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
Laravel怎么清理缓存_Laravel optimize clear命令详解
如何为不同团队 ID 动态生成多个独立按钮
java中使用zxing批量生成二维码立牌
网页设计与网站制作内容,怎样注册网站?
微信小程序 scroll-view组件实现列表页实例代码
如何快速生成ASP一键建站模板并优化安全性?
昵图网官网入口 昵图网素材平台官方入口
如何用wdcp快速搭建高效网站?
如何选择可靠的免备案建站服务器?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
公司网站制作价格怎么算,公司办个官网需要多少钱?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像

