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

news2024/11/29 3:55:24

背景

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

简介

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; // 一个静态局部变量,用于生成id
    id = 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.coloradmin.cn/o/2227359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前后端请求、返回数据的多种方式

Springboot项目的业务逻辑 &#x1f319;项目基本结构&#xff1a; 通常情况下&#xff0c;我们在搭建后端项目的时候&#xff0c;处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)&#xff0c;Entry各层之间的相互调用来完成&#xff0c;还有就是我…

计算机网络-MSTP的基础概念

前面我们大致了解了MSTP的由来&#xff0c;是为了解决STP/RSTP只有一根生成树导致的VLAN流量负载分担与次优路径问题&#xff0c;了解MSTP采用实例映射VLAN的方式实现多实例生成树&#xff0c;MSTP有很多的理论概念需要知道&#xff0c;其实与其它的知识一样理论复杂配置还好的…

php伪协议和move_uploaded_file、rename、copy等文件操作

move_uploaded_file、rename、copy 三个函数的区别&#xff1a; move_uploaded_file 函数是专门用于将通过 HTTP 上传的临时文件移动到指定位置的。如果你想要将一个已经存在的文件移动到另一个位置&#xff0c;而不是上传的文件&#xff0c;那么你应该使用 rename 函数或 co…

Lucas带你手撕机器学习——套索回归

好的&#xff0c;下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用&#xff0c;同时还会讨论其优缺点和一些常见问题。 套索回归&#xff08;Lasso Regression&#xff09; 1. 背景与动机 在机器学习和统计学中&#xff0c;模型的复杂性通常会影响其在…

完全透彻了解一个asp.net core MVC项目模板1

当我们使用Visual Studio 2022去新建一个基于asp.net core Web项目的时候&#xff0c;一般有三种选择&#xff0c;一种是空项目&#xff0c;一种是基于MVC的项目、再有一种就是基于包含Razor Pages实例的web应用。如下图&#xff1a; 今天&#xff0c;我们打算选择基于MVC模…

【无标题】2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题

2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题已发布~&#xff0c;本届初赛时间为&#xff1a;2024年10月25日18:00至2024年11月1日20:00。本次赛题分为A&#xff0c;B两道&#xff0c;所有参赛队从赛道 A、B 中任选一题作答。在报名系统内选择自己队伍的赛道时&am…

离散化算法简介

【离散化简介】 ★ 离散化是一种数据处理的技巧&#xff0c;本质上可以看成是一种“哈希”&#xff0c;其保证数据在哈希以后仍然保持原来的“全/偏序”关系。用来离散化的可以是大整数、浮点数、字符串等等。★ 离散化的本质&#xff0c;是映射。原理是将间隔很大的元素&#…

毫米波技术基础

什么是毫米波&#xff1f; 顾名思义&#xff0c;毫米波是波长 (λ) 约为 1 毫米&#xff08;更准确地说是 1 至 10 毫米&#xff09;的电磁波。使用方程式f c /λ 将该波长转换为频率&#xff0c;其中c是光速 (3 x 10 8 m/s)&#xff0c;得出 30-300 GHz 的频率范围。国际电信…

【STM32】内存管理

首先问个问题&#xff0c;你知道如何在LCD上显示SD卡文件浏览&#xff1f;-----需要读取所有文件名到内存&#xff0c;然后才能显示到LCD上。 一般的方法&#xff1a;是定义一个数组来存储文件名 1&#xff1a;需要知道最大文件名的长度 2&#xff1a;需要知道文件的个数。1…

OpenCV图像处理方法:腐蚀操作

腐蚀操作 前提 图像数据为二值的&#xff08;黑/白&#xff09; 作用 去掉图片中字上的毛刺 显示图片 读取一个图像文件&#xff0c;并在一个窗口中显示它。用户可以查看这个图像&#xff0c;直到按下任意键&#xff0c;然后程序会关闭显示图像的窗口 # cv2是OpenCV库的P…

使用Python中的jieba库进行简单情感分析

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情感分析是一项重要的任务&#xff0c;它可以帮助我们理解文本背后的情感倾向。本文将通过一个简单的例子来介绍如何使用Python的jieba库对中文文本进行基本的情感分析。 1. 环境准备 首先&#xff0c;确保已经安装…

图像分割从基础到进阶:阈值化、K-means和Mean-Shift算法的应用

图像分割是计算机视觉中的一项关键技术&#xff0c;用来将图像划分为若干个 有意义 的区域&#xff0c;以便后续的图像处理和分析工作。根据任务的不同&#xff0c;图像分割可以进一步细分为语义分割、实例分割和全景分割&#xff1a; 语义分割 (Semantic Segmentation) 对图像…

SQL进阶技巧:如何求组内排除当前行的移动平均值?

目录 0 需求描述 2 数据准备 3 问题分析 4 小结 0 需求描述 -- 按照 日期,省份,等级 分组 求分数的平均值;但是需要剔除当前行的数据 2 数据准备 create table avgtest as (select 2024-10-24 as cdate, 广东 as province,深圳 as city, 2 as level, 200 as scoreunio…

后台管理系统的通用权限解决方案(六)SpringBoot整合Logback实现日志记录

1 Logback介绍 1.1 Logback的组件 由上图可知&#xff0c;Logback和Log4j都是slf4j规范的具体实现。在程序中直接调用Logback的API其实都是slf4j规范定义好的API&#xff0c;其底层则是真正的日志实现组件—Logback或者Log4j。 Logback构建在三个主要的类上&#xff1a;Logge…

厨艺爱好者的在线互动平台:Spring Boot实现

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功能…

面试域——技术面试准备

摘要 来到技术面试这环节有两种情况&#xff0c;其一&#xff1a;这场技术面试可能就是一个面试官KPI面试&#xff08;就是面试工作量&#xff0c;这个面试你是不可能过。&#xff09;如今的就业环境下&#xff0c;人力资源部门也是有考核指标。如果遇到这样的面试你就放平心态…

2024年【焊工(中级)】最新解析及焊工(中级)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;中级&#xff09;最新解析参考答案及焊工&#xff08;中级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及焊工&#xff08;中级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

VsCode | 修改内置字体为JetBrains Mono NL

文章目录 一、下载JetBrains Mono NL字体二、VsCode进行字体的设置 一、下载JetBrains Mono NL字体 字体下载 下载完成以后解压找到JetBrainsMono-2.304\fonts\ttf文件夹下&#xff0c;全选鼠标右键点安装即可。 注意&#xff1a;一定要全部安装&#xff0c;否则字体样式可…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

Wasserstein Generative Adversarial Networks

Abstract 我们引入了一种名为 WGAN 的新算法&#xff0c;它是传统 GAN 训练的替代方案。 在这个新模型中&#xff0c;我们表明我们可以提高学习的稳定性&#xff0c;摆脱模式崩溃等问题&#xff0c;并提供对调试和超参数搜索有用的有意义的学习曲线。 此外&#xff0c;我们表明…