c++如何用cereal库序列化 c++ header-only序列化【指南】
技术百科
尼克
发布时间:2025-12-29
浏览: 次 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 o
s("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引入
# ai
# 只需
# 自定义
# 有几个
# 因为它
# js
# json
# 对象
# c++
# String
# int
# double
# void
# class
# xml
# 序列化
# ar
# 成员函数
# 结构体
# 头文件
# Struct
# map
# 不依赖
# 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; ?>
】
相关推荐
- 使用类变量定义字符串常量时的类型安全最佳实践
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- 如何在Golang中引入测试模块_Golang测试
- Mac如何解压zip和rar文件?(推荐免费工具)
- Windows10电脑怎么查看硬盘通电时间_Win
- Win10电脑C盘红了怎么清理_Windows10
- Win11如何设置开机问候语 Win11修改登录界
- Win11怎么设置触控板手势_Windows11三
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- Win10怎样安装Excel数据分析工具_Win1
- 怎么将XML数据可视化 D3.js加载XML
- 如何在Golang中处理云原生事件_使用Event
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- Python实现图数据库操作_Neo4j核心CRU
- Win10系统更新错误0x80240034怎么办
- 如何在 Go 中调用动态链接库(.so)中的函数
- php增删改查在php8里有什么变化_新特性对cu
- c++ namespace命名空间用法_c++避免
- Win10怎样卸载DockerDesktop_Wi
- C#如何使用XPathNavigator高效查询X
- php增删改查需要哪些扩展_开启mysqli或pd
- mac怎么打开终端_MAC终端Terminal使用
- Linux怎么修改用户密码_Linux系统pass
- Win11怎么修改DNS服务器 Win11设置DN
- Win11麦克风没声音怎么设置_Win11麦克风权
- Windows 10自带杀毒软件在哪_Window
- Python面向对象实战讲解_类与设计模式深入理解
- Win11怎么恢复误删照片_Win11数据恢复工具
- Windows10电脑怎么设置虚拟光驱_Win10
- Bpmn 2.0的XML文件怎么画流程图
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- c++ std::future和std::prom
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- 如何在Golang中验证模块完整性_Golangg
- Win11应用商店下载慢怎么办 Win11更改DN
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- windows如何测试网速_windows系统网络
- php嵌入式需要什么环境_搭建php+linux嵌
- Win11怎么开启远程桌面_Win11系统远程桌面
- 如何在Golang中处理二进制数据_Golang
- Win11怎么关闭透明效果_Windows11辅助
- Python异步网络编程_aiohttp说明【指导
- 如何在 Pandas 中按元素交集合并两列字符串
- PHP主流架构怎么部署到Docker_容器化流程【
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Windows怎样拦截QQ浏览器广告_Window
- Win10如何备份注册表_Win10注册表备份步骤
- Windows系统时间服务错误_W32Time服务
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- Win11笔记本怎么看电池健康度_Win11电池报

QQ客服