【ceral】c++轻量的序列化库

背景

在开发硬件产品时,会有一些参数配置文件,为了保密性或者传输,需要对其序列化处理,待到产品读取文件时,进行反序列化解码转化为设定的参数类型。

简介

ceral是一个仅包含头文件的C++序列化库,可以将任意的数据类型,转化为二进制编码、XML或者JSON。ceral具有轻量、快速、易扩展的特性,不依赖于其他任何库。
cereal 提供了对标准库中几乎所有类型的序列化支持,并且开箱即用。cereal 还完全支持继承和多态。由于 cereal 被设计为一个最小且快速的库,它并不像 Boost 等其他序列化库那样执行相同级别的对象跟踪。因此,它不支持裸指针和引用,但智能指针(如 std::shared_ptr 和 std::unique_ptr)没有问题。

如何使用

#include <cereal/types/unordered_map.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/archives/binary.hpp>
#include <fstream>// 定义一个结构体MyRecord,用于存储记录
struct MyRecord
{uint8_t x, y; // 两个无符号8位整数float z;      // 一个浮点数// 序列化函数模板,用于序列化和反序列化MyRecord对象template <class Archive>void serialize( Archive & ar ){ar( x, y, z ); // 将x, y, z序列化或反序列化}
};// 定义一个结构体SomeData,用于存储更复杂的数据
struct SomeData
{int32_t id;                           // 一个32位整数,用于标识std::shared_ptr<std::unordered_map<uint32_t, MyRecord>> data; // 一个智能指针,指向一个unordered_map,存储uint32_t键和MyRecord值// 序列化函数模板,用于序列化SomeData对象template <class Archive>void save( Archive & ar ) const{ar( data ); // 序列化data成员}// 序列化函数模板,用于反序列化SomeData对象template <class Archive>void load( Archive & ar ){static int32_t idGen = 0; // 一个静态局部变量,用于生成idid = idGen++;             // 每次反序列化时,id自增并赋值给当前对象ar( data );               // 反序列化data成员}
};int main()
{// 创建一个ofstream对象,用于写入文件,以二进制模式打开std::ofstream os("out.cereal", std::ios::binary);// 创建一个cereal的二进制输出存档对象cereal::BinaryOutputArchive archive( os );// 创建SomeData对象SomeData myData;// 将myData对象序列化到存档中archive( myData );return 0; // 程序结束
}

举一些简单的例子:

  1. 保存如下的用户参数。
bool bIsValid = true;
int a = 1;
float b = 3.11;
double c = 4.3333;
#include "cereal/types/unordered_map.hpp"
#include "cereal/types/memory.hpp"
#include "cereal/archives/binary.hpp"
#include <fstream>
#include <sstream>template <class T>
void save(cereal::BinaryOutputArchive & archive, const std::string & str_name, const T value)
{archive(str_name);archive(value);std::stringstream s;s << std::endl;archive(s.str());
}template <class T>
void load(std::string & str_name, T & value, cereal::BinaryInputArchive & archive)
{archive(str_name);archive(value);std::string str;archive(str);
}void main()
{// 序列化保存为params二进制文件std::string str_file_name = "params";std::ofstream os(str_file_name , std::ios::binary);cereal::BinaryOutputArchive archive(os);save(archive, "bIsValid ", bool(true));save(archive, "a", (int)1);save(archive, "b", (float)3.11);save(archive, "c", (double)4.3333);os.close();// 加载该文件std::ifstream is(str_file_name , std::ios::binary);cereal::BinaryInputArchive inputArchive(is);std::string str_name;bool bIsValid;load(str_name, bIsValid, inputArchive);std::cout << str_name << " " << bIsValid << std::endl;int a;load(str_name, a, inputArchive);std::cout << str_name << " " << a << std::endl;float b;load(str_name, b, inputArchive);std::cout << str_name << " " << b << std::endl;double c;load(str_name, c, inputArchive);std::cout << str_name << " " << c << std::endl;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459296.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分组数据的交叉验证方法【Python代码汇总】

分组数据的交叉验证方法 如果生成过程产生了依赖样本的组&#xff0c;那么独立同分布&#xff08;i.i.d.&#xff09;假设就会失效。 . 这种数据分组是特定于领域的。例如&#xff0c;医疗数据通常从多位患者中收集&#xff0c;每位患者可能包含多个样本&#xff0c;而这些样本…

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域&#xff0c;我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer&#xff08;MMDiT&#xff09;驱动的文本到图像模型&#xff0c;它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…

云原生笔记

#1024程序员节|征文# 单页应用(Single-Page Application&#xff0c;SPA) 云原生基础 云原生全景内容宽泛&#xff0c;以至于刚开始就极具挑战性。 云原生应用是高度分布式系统&#xff0c;它们存在于云中&#xff0c;并且能够对变化保持韧性。系统是由多个服务组成的&#…

三维测量与建模笔记 - 2.1 坐标转换基础

2D坐标变换 平移可以看做是对原始的x和y加上了一个偏移&#xff0c;也可以理解为按照给定的平移向量进行移动。 缩放变换&#xff0c;本质是对x&#xff0c;y乘上一个缩放系数。 综合缩放、旋转、平移 矩阵乘法的顺序会对结果有影响&#xff0c;需要注意。 2D欧氏变换 2D欧式…

IDM下载器 (Internet Download Manager) v6.42.2 中文免激活绿色版

Internet Download Manager (IDM下载器) 是一款先进的下载工具,可以提升您的下载速度高达5倍,支持续传&#xff0c;IDM可以让用户自动下载某些类型的文件&#xff0c;它可将文件划分为多个下载点以更快速度下载&#xff0c;并列出最近的下载&#xff0c;方便访问文件。相对于其…

RAGChecker:显著超越RAGAS,一个精细化评估和诊断 RAG 系统的创新框架

RAG应用已经是当下利用大模型能力的典型应用代表&#xff0c;也获得了极大的推广&#xff0c;各种提升RAG性能的技术层出不穷。然而,如何全面、准确地评估 RAG 系统一直是一个挑战。传统评估方法存在诸多局限性:无法有效评估长文本回复、难以区分检索和生成模块的错误来源、与人…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

php怎么并发处理

PHP的并发处理是指在同一时间能够处理多个请求&#xff0c;提高系统的吞吐量和响应速度。下面介绍几种PHP的并发处理方法。 一、多线程 多线程是指在一个进程中启动多个线程同时执行任务。在PHP中&#xff0c;可以使用pthreads扩展来实现多线程编程。pthreads提供了Thread、W…

MySQL快速入门——库的操作

MySQL快速入门——库的操作 1. 创建数据库2. 创建数据库案例3. 字符集和校验规则3.1 查看字符集和校验规则3.2 验证不同校验编码的影响 4. 操作数据库4.1 查看数据库4.2 修改数据库4.3 数据库删除4.4 备份和恢复 5. 查看连接情况 1. 创建数据库 1. 语法&#xff1a; CREATE DA…

Rust编程与项目实战-元组

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 8.2.1 元组的定义 元组是Rust的内置复合数据类型。Rust支持元组&#xff0c;而且元…

Linux服务器运维宝典(一)

基础命令&#xff1a; ls&#xff1a;列出目录下的内容 ls [ -a -l -h] Linux路径当不使用选项和参数&#xff0c;直接使用 ls 命令本体&#xff0c;表示&#xff1a;以平铺形式&#xff0c;列出当前工作目录下的内容选项&#xff1a; -a&#xff1a;all 的意思&#xff0c;…

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …

山西农业大学20241029

08-VUE 一. 组件化开发项目1. 准备工作2. 开发思路3. 拆分页面图4. App.vue5. 项目优化 - 全局注册两个小组件 二. 组件三大组成部分细节1. 样式设置2. data必须是一个函数2.1 原因 一. 组件化开发项目 1. 准备工作 将准备好的App.vue中的内容复制到项目中将图片保存到assets下…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

如何使用 Vite 创建一个项目(Vue 或者 React)

如何使用 vite 创建一个 Vue 或者 React 项目&#xff1f; 打开终端&#xff0c;输入命令 npm create vitelatest外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 修改你需要的项目名 选择你要创建的项目的框架&#xff08;Vue 还是 React 这是个问题&am…

医学影像基础:常见的医学影像学术语和概念

目录 1. 基本影像术语 2. X射线相关术语 3. CT相关术语 4. MRI相关术语 5. 超声相关术语 6. 核医学相关术语 7. 影像质量和技术术语 8. 临床影像术语 总结 在医学影像学中&#xff0c;有许多术语和概念是常用且重要的。了解这些术语和概念有助于更好地理解影像报告、与…

Linux 读者写者模型

1.背景概念 在编写多线程的时候&#xff0c;有一种情况是十分常见的。那就是&#xff0c;有些公共数据修改的机会比较少。相比较改写&#xff0c;它们读的机会反而高的多。这样就衍生出了读者写者模型&#xff0c;在这个模型中&#xff0c;有两类线程&#xff1a;读者和写者。读…

Linux补基础之:网络配置

目录 一、检查主机与虚拟机是否能正常通信 二、网络的连接模式 桥接模式 流程 特点 NAT模式 流程 特点 仅主机 流程 特点 三、修改静态IP 四、可能遇到的问题 防火墙 DNS 五、主机名更改 六、登录服务器 实际的大数据管理中&#xff0c;会有由很多服务器构成的…

使用AMD GPU和LangChain构建问答聊天机器人

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs 作者&#xff1a;Phillip Dang 2024年3月11日 LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力&#xff0c;L…

蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位

党的二十届三中全会指出&#xff0c;科技自立自强是中国式现代化的有力保障。科技兴则民族兴&#xff0c;科技强则国家强。为深入的贯彻落实这一重要部署&#xff0c;推动工业与科技领域的融合发展充分发挥电影艺术在传播科技创新精神、展现工业发展成就方面的独特作用&#xf…