C++ Cereal序列化库的使用
C++ Cereal 库使用指南
Cereal 是一个轻量级的 C++ 序列化库,用于将对象序列化为二进制、XML 或 JSON 格式,以及从这些格式反序列化。它支持标准库类型和用户自定义类型的序列化,且无需修改原有类定义。
基本用法
1. 安装与包含
#include <cereal/archives/binary.hpp> #include <cereal/types/vector.hpp> // 包含对vector的支持 #include <cereal/types/string.hpp> // 包含对string的支持
2. 基本序列化/反序列化
#include <fstream>
#include <iostream>
#include <vector>struct MyData {int x;double y;std::string z;std::vector<int> nums;// 序列化函数模板template<class Archive>void serialize(Archive & archive) {archive(x, y, z, nums); // 序列化所有成员}
};int main() {MyData data1{42, 3.14, "hello", {1, 2, 3}};// 序列化到文件{std::ofstream os("data.bin", std::ios::binary);cereal::BinaryOutputArchive archive(os);archive(data1); // 写入数据}// 从文件反序列化MyData data2;{std::ifstream is("data.bin", std::ios::binary);cereal::BinaryInputArchive archive(is);archive(data2); // 读取数据}std::cout << data2.x << ", " << data2.y << ", " << data2.z << std::endl;return 0;
}
高级特性
1. 分离加载和保存
struct MyClass {int a;std::string b;template<class Archive>void save(Archive & archive) const {archive(a, b);}template<class Archive>void load(Archive & archive) {archive(a, b);}
};
2. 版本控制
struct VersionedData {int x;std::string y;template<class Archive>void serialize(Archive & ar, const std::uint32_t version) {ar(x, y);if(version >= 2) {// 版本2新增的字段}}
};// 注册版本
CEREAL_CLASS_VERSION(VersionedData, 2)
3. 指针和智能指针
struct Node {int value;std::shared_ptr<Node> next;template<class Archive>void serialize(Archive & ar) {ar(value, next);}
};
4. 继承
struct Base {int x;template<class Archive>void serialize(Archive & ar) {ar(x);}
};struct Derived : Base {double y;template<class Archive>void serialize(Archive & ar) {ar(cereal::base_class<Base>(this), y);}
};
不同格式支持
1. 二进制格式
#include <cereal/archives/binary.hpp>// 输出
std::ofstream os("data.bin", std::ios::binary);
cereal::BinaryOutputArchive archive(os);
archive(data);// 输入
std::ifstream is("data.bin", std::ios::binary);
cereal::BinaryInputArchive archive(is);
archive(data);
2. JSON格式
#include <cereal/archives/json.hpp>// 输出
std::ofstream os("data.json");
cereal::JSONOutputArchive archive(os);
archive(cereal::make_nvp("MyData", data)); // 使用命名// 输入
std::ifstream is("data.json");
cereal::JSONInputArchive archive(is);
archive(data);
3. XML格式
#include <cereal/archives/xml.hpp>// 输出
std::ofstream os("data.xml");
cereal::XMLOutputArchive archive(os);
archive(cereal::make_nvp("MyData", data));// 输入
std::ifstream is("data.xml");
cereal::XMLInputArchive archive(is);
archive(data);
实际应用示例
1. 序列化自定义类
class Person {
public:Person() = default;Person(std::string n, int a) : name(n), age(a) {}private:std::string name;int age;std::vector<std::string> friends;friend class cereal::access;template<class Archive>void serialize(Archive & ar) {ar(name, age, friends);}
};
2. 序列化STL容器
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};
std::vector<double> myVec = {1.1, 2.2, 3.3};{std::ofstream os("container.bin", std::ios::binary);cereal::BinaryOutputArchive archive(os);archive(myMap, myVec);
}
3. 多态类型序列化
struct Base {virtual void foo() = 0;virtual ~Base() = default;template<class Archive>void serialize(Archive & ar) {}
};struct Derived : Base {int x;void foo() override {}template<class Archive>void serialize(Archive & ar) {ar(cereal::base_class<Base>(this), x);}
};// 注册多态类型
CEREAL_REGISTER_TYPE(Derived)
注意事项
-
默认构造函数:反序列化的类必须有可访问的默认构造函数
-
内存管理:序列化原始指针时需要特别小心,推荐使用智能指针
-
版本兼容性:修改类结构后,旧版本数据可能无法正确反序列化
-
性能:二进制格式通常比文本格式更高效
-
可移植性:二进制数据在不同平台间可能存在兼容性问题
Cereal 是一个强大而灵活的序列化库,通过简单的接口实现了复杂对象的序列化功能,非常适合需要持久化或网络传输C++对象的场景。
深入学习链接(参考🔗)C++序列化Cereal库的使用-CSDN博客
相关文章:
C++ Cereal序列化库的使用
C Cereal 库使用指南 Cereal 是一个轻量级的 C 序列化库,用于将对象序列化为二进制、XML 或 JSON 格式,以及从这些格式反序列化。它支持标准库类型和用户自定义类型的序列化,且无需修改原有类定义。 基本用法 1. 安装与包含 #include <…...
热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索
654.最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大…...
如何查看linux history命令文件
在Linux系统中,history命令用于显示用户在终端会话中执行过的命令历史。默认情况下,这些命令被保存在用户的家目录下的一个隐藏文件中,通常是.bash_history(对于bash shell)或.zsh_history(对于zsh shell&a…...
css易混淆的知识点
子选择器 (>) vs 后代选择器 (空格) 子选择器 (>) 只匹配直接子元素。后代选择器 (空格) 匹配所有后代元素(无论嵌套多深)。 绝对定位vs相对定位 布局: justify-content 的作用 控制子元素在主轴上的分布方式。常见值包括 flex-start、…...
Java对接智能客服:从0到1构建高并发对话系统的实战指南
引言:智能客服的进化与Java生态的融合 在数字化转型浪潮中,智能客服系统已成为企业服务升级的标配。当传统规则引擎逐步让位于NLP大模型,Java开发者如何构建高效稳定的对话系统?本文将结合阿里云通义千问、百度文心等最新AI能力&…...
【前缀和】矩阵区域和(medium)
矩阵区域和(medium) 题⽬描述:解法:代码Java 算法代码:C 算法代码: 题⽬描述: 题⽬链接:1314. 矩阵区域和 给你⼀个 m x n 的矩阵 mat 和⼀个整数 k ,请你返回⼀个矩阵 …...
5分钟用Docker Desktop新功能搭建Python+AI开发环境
Docker Desktop 4.25版本通过预置AI开发模板与零配置GPU支持,彻底简化PythonAI环境搭建流程。无需手动安装CUDA、无需配置虚拟环境,3条命令完成从零到模型训练的完整工作流。 一、Docker Desktop新功能核心价值 1.1 预置AI开发镜像库 • 开箱即用的深度…...
一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一,相比CSV文件,Excel是有样式的。Pandas2提…...
BERT-DDP
DDP 代码执行流程详解 这份代码执行的是一个典型的数据并行分布式训练流程,利用多个 GPU(可能分布在多个节点上)来加速模型训练。核心思想是每个 GPU 处理一部分数据,计算梯度,然后同步梯度并更新模型。 假设你使用 …...
【MySQL】002.MySQL数据库基础
文章目录 数据库基础1.1 什么是数据库1.2 基本使用创建数据库创建数据表表中插入数据查询表中的数据 1.3 主流数据库1.4 服务器,数据库,表关系1.5 MySQL架构1.6 SQL分类1.7 存储引擎1.7.1 存储引擎1.7.2 查看存储引擎1.7.3 存储引擎对比 前言:…...
02-redis-源码下载
1、进入到官网 redis官网地址https://redis.io/ 2 进入到download页面 官网页面往最底下滑动,找到如下页面 点击【download】跳转如下页面,直接访问:【https://redis.io/downloads/#stack】到如下页面 3 找到对应版本的源码 https…...
大模型上下文协议MCP详解(1)—技术架构与核心机制
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. MCP概述 1.1 定义与目标 MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议。它旨在解决AI大模型与外部工具、数据源及API之间的标准化交互问题…...
Windows下安装depot_tools
一、引言 Chromium和Chromium OS使用名为depot_tools的脚本包来管理检出和审查代码。depot_tools工具集包括gclient、gcl、git-cl、repo等。它也是WebRTC开发者所需的工具集,用于构建和管理WebRTC项目。本文介绍Windows系统下安装depot_tools的方法。 二、下载depo…...
解决 vite.config.ts 引入scss 预处理报错
版本号: "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错1:[plugin:vite:css] [SASS] Error:Cant find stylesheet to import vite.config.ts 开始文件错…...
MySQL学习笔记7【InnoDB】
Innodb 1. 架构 1.1 内存部分 buffer pool 缓冲池是主存中的第一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删查改操作时,先操作缓冲池中的数据,然后以一定频率刷新到磁盘,这样操作明显提升了速度。 …...
分布式锁和事务注解结合使用
在分布式系统中,事务注解(如 Transactional)与分布式锁的结合使用是保障数据一致性和高并发安全的核心手段。以下是两者的协同使用场景及技术实现要点: 一、事务注解的局限性及分布式锁的互补性 维度事务注解(Transac…...
全国产压力传感器常见的故障有哪些?
全国产压力传感器常见的故障如哪些呢?来和武汉利又德的小编一起了解一下,主要包括以下几类: 零点漂移 表现:在没有施加压力或处于初始状态时,传感器的输出值偏离了设定的零点。例如,压力为零时,…...
使用nhdeep档案目录打印工具生成干部人事档案目录打印文件
打开nhdeep档案目录打印工具,在左侧的模版列表中选中"干部人事档案目录"模版。 然后点击右下角“批量导入行”按钮,选择事先准备好的人事目录数据excel文件完成导入。 人事目录数据excel文件的结构和内容如下: 导入完成后…...
工作记录 2015-08-24
工作记录 2015-08-24 序号 工作 相关人员 1 更新76.19的D:\FNEHRRD,更新的差不多了,还在测试中。具体情况见附件。 郝 识别引擎监控 Ps (iCDA LOG :剔除了204篇ASG_BLANK之后的结果): LOG_File 20150823.txt BLANK_CDA/ALL 102/947 (10.8%) TIME…...
在 Dev-C++中编译运行GUI 程序介绍(三)有趣示例一组
在 Dev-C中编译运行GUI程序介绍(三)有趣示例一组 前期见 在 Dev-C中编译运行GUI 程序介绍(一)基础 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中编译运行GUI 程序介绍(二)示例&a…...
Compose 适配 - 响应式排版 自适应布局
一、概念 基于可用空间而非设备类型来设计自适应布局,实现设备无关性和动态适配性,避免硬编码,以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式…...
光储充智能协调控制系统的设计与应用研究
摘要 随着化石能源枯竭与环境污染问题加剧,构建高效、稳定的新能源系统成为能源转型的关键。本文针对光伏发电间歇性、储能系统充放电效率及充电桩动态负荷分配等技术挑战,提出一种基于智能协调管理的光储充一体化解决方案。通过多源数据融合与优化控制算…...
UE4 踩坑记录
1、Using git status to determine working set for adaptive non-unity build 我删除了一个没用的资源,结果就报这个错,原因就是这条命令导致的, 如果这个项目是git项目, ue编译时会优先通过 git status检查哪些文件被修改&#…...
C语言超详细指针知识(一)
通过前面一段学习C语言的学习,我们了解了数组,函数,操作符等相关知识,今天我们将要进行指针学习,这是C语言中较难的一个部分,我将带你由浅入深慢慢学习。 1.内存与地址 在正式学习指针前,我们首…...
《算法笔记》3.3小节——入门模拟->图形输出
1036 跟奥巴马一起编程 #include <iostream> #include <cmath> using namespace std;int main() {int n,m;char c;cin>>n>>c;for (int i 0; i < n; i) {cout<<c;}cout<<endl;m round(1.0*n/2)-2;//round里面不能直接写n/2,…...
【深入浅出 Git】:从入门到精通
这篇文章介绍下版本控制器。 【深入浅出 Git】:从入门到精通 Git是什么Git的安装Git的基本操作建立本地仓库配置本地仓库认识工作区、暂存区、版本库的概念添加文件添加文件到暂存区提交文件到版本库提交文件演示 理解.git目录中的文件HEAD指针与暂存区objects对象 …...
在gitee上创建仓库——拉取到本地---添加文件---提交
2025/04/11/yrx0203 1-创建仓库 2-填写信息 3-创建完成后把仓库地址复制下来 4-在电脑上创建1个空的文件夹,进入这个文件夹,鼠标右击打开git bash 5-粘贴刚才复制的仓库的地址,回车 这样仓库就被拉取完成了 6-把本地的这个文件夹初始化…...
小刚说C语言刷题——第21讲 一维数组
在日常生活中,我们经常输入一组数据。例如输入一个班30名学生的语文成绩,或者输入一组商品的价格。这个时候,我们如何输入一组类型相同的数据呢?这里我们就要用到数组。 1.数组的概念 所谓数组就是一组相同类型数据的集合。数组中…...
芯片同时具备Wi-Fi、蓝牙、Zigbee,MAC地址会打架吗?
目录 【MAC 地址简介】 【MAC、Wi-Fi MAC、Bluetooth MAC的关系】 【以乐鑫ESP32-C6为例分析MAC】 【MAC 地址简介】 MAC(Media Access Control)地址是设备的物理地址,在全球范围内唯一标识每个网络接口。它是一个 48 比特(6 字…...
Kotlin 学习-方法和参数类型
/*** kotlin 的方法有三种* */fun main() {/*** 方法一* 1.普通类的成员方法申明与调用* (1)需要先构建出实例对象,才能访问成员方法* (2)实例对象的构建只需要在类名后面加上()* */Person().test()/*** 方法二&#x…...
