c++如何使用Cereal库进行序列化_c++现代化的序列化库【教程】
技术百科
冰火之心
发布时间:2025-12-30
浏览: 次 Cereal序列化核心三步:引入头文件、定义serialize函数、选JSON/Binary/XML存档;它轻量纯头文件、无需预编译,支持容器/智能指针/版本控制/继承。
使用 Cereal 库进行 C++ 序列化,核心就三步:引入头文件、定义序列化函数、选择存档类型(JSON / Binary / XML)来读写。它轻量、头文件仅依赖、无需预编译或 IDL,是现代 C++ 项目中非常自然的序列化方案。
1. 快速接入 Cereal
Cereal 是纯头文件库,直接下载 cereal/include/cereal 目录,加到项目 include 路径即可。CMake 中可这样引入:
include_directories(${CMAKE_SOURCE_DIR}/third_party/cereal/include)
无需链接任何库,也不需要生成代码 —— 它靠 C++ 模板和 ADL(参数依赖查找)自动发现序列化逻辑。
2. 为自定义类添加序列化支持
最常用方式是在类内部或外部定义 serialize 成员函数或非成员函数,签名固定为:template。
例如:
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 或放在同命名空间):
templatevoid serialize(Archive& ar, Person& p) { ar(CEREAL_NVP(p.name), CEREAL_NVP(p.age)); }
3. 选择存档类型并读写数据
Cereal 提供三种主流存档:
- 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。
基本上就这些。Cereal 不复杂但容易忽略细节:比如忘记加 template、误用 const 导致无法写入、或 JSON 读取前没检查文件是否存在。用熟之后,它比 Boost.Serialization 更清爽,比手写 JSON 解析更安全。
# 是在
# 放在
# 也不
# 并在
# 中非
# 三种
# 三步
# 配置文件
# js
# json
# c++
# void
# class
# 字节
# 指针
# stream
# xml
# 序列化
# red
# this
# ar
# 成员函数
# 析构函数
# 头文件
# 继承
# 命名空间
# map
# const
# include
# 字段名
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++ namespace命名空间用法_c++避免
- Win11怎么开启智能存储_Windows11存储
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Win11怎么更改账户头像_Windows 11自
- 如何在 Go 中调用动态链接库(.so)中的函数
- Python日志系统设计与实现_高可观测性架构实战
- 如何用::实现单例模式_php静态方法与作用域操作
- TestNG的testng.xml配置文件怎么写
- Python字符串处理进阶_切片方法解析【指导】
- 如何在JavaScript中动态拼接PHP的bas
- c# 在高并发场景下,委托和接口调用的性能对比
- Win11怎么设置默认浏览器Chrome_Wind
- Win11触摸板没反应怎么办_开启Win11笔记本
- Win11怎么开启游戏工具栏_Windows11
- 如何使用Golang实现路由分组管理_Golang
- 如何在Golang中实现RPC异步返回_Golan
- Win10怎样卸载TeamViewer_Win10
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Win11搜索栏无法输入_解决Win11开始菜单搜
- 如何在Golang中写入JSON文件_保存结构体数
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- c++ atoi和atof函数用法_c++字符数组
- 如何高效删除 NumPy 二维数组中所有元素相同的
- 如何解决同一段404代码在不同主机上表现不一致的问
- Windows 10怎么隐藏特定更新补丁_Wind
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win10怎么限制单程序CPU占用上限_Win10
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Win11怎么更改系统语言_Win11中文语言包下
- Win11右键反应慢怎么办 Win11优化右键菜单
- 如何在Windows上设置闹钟和计时器_系统自带的
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- windows如何禁用驱动程序强制签名_windo
- Python多线程使用规范_线程安全解析【教程】
- Windows系统时间服务错误_W32Time服务
- WindowsUSB驱动安装异常怎么办_USB驱动
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- C++中的Pimpl idiom是什么,有什么好处
- win11 OneDrive怎么彻底关闭 Win1
- php修改数据怎么改富文本_update更新htm
- LINUX如何查看文件类型_Linux中file命
- Win11如何设置开机自动联网 Win11宽带连接
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Win11截图快捷键是什么_Win11自带截图工具
- Win11键盘快捷键大全_Windows 11常用
- php怎么捕获异常_trycatch结构处理运行时
- 如何优化Golang内存分配与GC调度_Golan
- Python路径拼接规范_跨平台处理说明【指导】
- Win10如何更改用户账户控制_Windows10

};
QQ客服