[C++] 简单序列化
前言
序列化(Serialization)
是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
使用
序列化
std::array<int, 1> arr = {147};std::initializer_list<int> lst = {951, 623};std::vector<int> vec = {123, 456, 789};ntl::Serialization ser2 = ntl::Serializer::serialize(arr);ntl::Serialization ser3 = ntl::Serializer::serialize(lst);ntl::Serialization ser4 = ntl::Serializer::serialize(vec);
反序列化
std::vector<int> vec2;std::vector<int> vec3;std::vector<int> vec4;ntl::Deserializer::deserialize(ser2, vec2);ntl::Deserializer::deserialize(ser3, vec3);ntl::Deserializer::deserialize(ser4, vec4);
代码
序列化的代码算不上多,但也不少,可以在github上找到完整版
Serializable
Serializable就是能被序列化的对象,有三个接口:
virtual Serialization serialize() = 0;
virtual Serialization serialize() const = 0;
virtual SelfType &deserialize(const Serialization &serialization) = 0;
用于序列化与反序列化
/// @brief 可序列化的对象class NTL_ALIGN Serializable : public Object{public:using SelfType = Serializable;using ParentType = Object;public:constexpr Serializable() noexcept = default;constexpr explicit Serializable(const SelfType &from) noexcept = default;~Serializable() override = default;public:constexpr SelfType &operator=(const SelfType &from) noexcept = default;public:/// @brief 序列化本对象/// @return 序列virtual Serialization serialize() = 0;/// @brief 序列化本对象/// @return 序列virtual Serialization serialize() const = 0;/// @brief 反序列化至本对象/// @param serialization 序列/// @return 本对象virtual SelfType &deserialize(const Serialization &serialization) = 0;};
Serialization
Serialization就更简单的,就是一封装了的字符串
/// @brief 序列class NTL_ALIGN Serialization : public Object{public:using SelfType = Serialization;using ParentType = Object;protected:/// @brief 序列String m_serialization;public:Serialization() = default;explicit Serialization(const String &serialization);explicit Serialization(const SelfType &from) = default;~Serialization() override = default;public:SelfType &operator=(const SelfType &from) = default;operator String();operator String() const;public:/// @brief 获取序列/// @return 序列const ntl::String &get_serialization() const;/// @brief 设置序列/// @param serialization 序列/// @return 本对象SelfType &set_serialization(const ntl::String &serialization);};
Serializer
Serializer主要负责序列化基础类型
/// @brief 序列化器class NTL_ALIGN Serializer : public Object{public:using SelfType = Serializer;using ParentType = Object;public:Serializer() = default;explicit Serializer(const SelfType &from) = default;~Serializer() override = default;public:SelfType &operator=(const SelfType &from) = default;public:static Serialization serialize(const Serializable &object);static Serialization serialize(char value);template <typename ValueType>static Serialization serialize(const ValueType &value);template <typename CharTraitsType, typename AllocatorType>static Serialization serialize(const std::basic_string<Char, CharTraitsType, AllocatorType> &str);template <typename ElementType, std::size_t size>static Serialization serialize(const std::array<ElementType, size> &container);template <typename ElementType, typename AllocatorType>static Serialization serialize(const std::vector<ElementType, AllocatorType> &container);template <typename ElementType>static Serialization serialize(const std::initializer_list<ElementType> &container);template <typename IteratorType>static Serialization serialize_container(const IteratorType &begin, const IteratorType &end);template <typename ElementType>static Serialization serialize_container(const ElementType *begin, SizeT size);};
Deserializer
Deserializer也是一样的,但是多了对序列的检查
其中用于检测的正则表达式长这样:
String Deserializer::regex_is_integer = NTL_STRING("[0-9]+");
String Deserializer::regex_is_float0 = NTL_STRING("[0-9]+[fd]?");
String Deserializer::regex_is_float1 = NTL_STRING("[0-9]+.[fd]?");
String Deserializer::regex_is_float2 = NTL_STRING(".[0-9]+[fd]?");
String Deserializer::regex_is_float3 = NTL_STRING("[0-9]+.[0-9]+[fd]?");
String Deserializer::regex_is_string = NTL_STRING("\"(.*)\"");
/// @brief 反序列化器class NTL_ALIGN Deserializer : public Object{public:using SelfType = Deserializer;using ParentType = Object;/// @brief 整数static String regex_is_integer;/// @brief 浮点数,形如123static String regex_is_float0;/// @brief 浮点数,形如123.static String regex_is_float1;/// @brief 浮点数,形如.123static String regex_is_float2;/// @brief 浮点数,形如123.123static String regex_is_float3;/// @brief 是否为字符串,形如"abc"static String regex_is_string;public:Deserializer() = default;explicit Deserializer(const SelfType &from) = default;~Deserializer() override = default;public:SelfType &operator=(const SelfType &from) = default;public:template <typename ResultType>static ResultType deserialize(const Serialization &serialization);static void deserialize(const Serialization &serialization, Serializable &result);static void deserialize(const Serialization &serialization, char &result);static void deserialize(const Serialization &serialization, short &result);static void deserialize(const Serialization &serialization, int &result);static void deserialize(const Serialization &serialization, long &result);static void deserialize(const Serialization &serialization, long long &result);static void deserialize(const Serialization &serialization, float &result);static void deserialize(const Serialization &serialization, double &result);template <typename CharTraitsType, typename AllocatorType>static void deserialize(const Serialization &serialization, std::basic_string<Char, CharTraitsType, AllocatorType> &result);template <typename ElementType>static void deserialize(const Serialization &serialization, std::vector<ElementType> &result);public:/// @brief 生成一个异常/// @param type 类型/// @return 异常static InvalidArgumentException make_exception(const String &type);/// @brief 检查是否为整数/// @param serialization 序列/// @return 是否为整数static bool is_integer(const Serialization &serialization);/// @brief 检查是否为浮点数/// @param serialization 序列/// @return 是否为浮点数static bool is_float(const Serialization &serialization);/// @brief 检查是否为字符串/// @param serialization 序列/// @return 是否为字符串static bool is_string(const Serialization &serialization);};
相关文章:
[C++] 简单序列化
前言 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 使用 序列化 std::array&…...
Autosar Configuration(十三)SomeIP之配置TCP/IP
本系列教程是根据实际项目开发中总结的经验所得,如发现有不对的地方,还请指正。 目录Autosar Configuration(一)Davinci Developer-工具介绍 Autosar Configuration(二)Davinci Developer-SWC配置 Autosar Configuration(三) Security之Crypto配置 Autosar Configurat…...
滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现
文章目录简介UKF滤波1. 概述和流程2. Python代码第一个版本a. KF滤波b. UKF滤波第二个版本简介 上一篇文章,我们介绍了UKF滤波公式及其MATLAB代码。在做视觉测量的过程中,基于OpenCV的开发包比较多,因此我们将UKF的MATLAB代码转到python中&a…...
IMU 积分的误差状态空间方程推导
文章目录0. 前言1. 离散时间的IMU运动学方程2. 状态变量定义3. 补充公式4. IMU误差状态空间方程推导4.1. 旋转误差 δr^i1\delta\hat{\mathbf{r}}_{i1}δr^i14.2. 速度误差 δv^i1\delta\hat{\mathbf{v}}_{i1}δv^i14.3. 平移误差 δpi1\delta \mathbf{p}_{i1}δpi14.4. …...
VirtualBox的克隆与复制
快照太多,想整合成1个文件怎么办? 最近,我就遇到一个问题。快照太多了。比较占用空间怎么办? 错误做法 一开始,我是这么操作的,选中某个快照,然后选择删除…然后我登录虚拟机后,发…...
每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?
本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…...
游戏闲聊之游戏是怎么赚钱的
其实一般情况下不太爱写这种文章,简单说就一点,这个行业的人我惹不起。 1、外挂 所谓外挂,是指通过技术手段,提供辅助游戏的工具,方便玩家获得一些额外的能力; 这事我特意咨询过律师,外挂分两…...
Redis高频面试题汇总(下)
目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey? 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染(或满了…...
Windows修改Docker安装目录修改Docker镜像目录,镜像默认存储位置存放到其它盘
Windows安装Docker,默认是安装在C盘,下载镜像后会占用大量空间,这时需要调整镜像目录;场景:不想连服务器或者没有服务器,想在本地调试服务,该需求就非常重要。基于WSL2安装docker后,…...
376. 摆动序列——【Leetcode每日刷题】
376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个…...
mgre实验
实验思路 1、首先根据拓扑结构合理分配IP地址,并对各个路由器的IP地址和R5环回接口的IP地址进行配置。 2、让私网中的边界路由器对ISP路由器做缺省路由。 3、根据实验要求,对需要配置不同类型认证的路由器进行认证配置,和需要不同封装的协议…...
一文彻底了解Zookeeper(介绍篇)
zookeeper 是什么? zookeeper是一个分布式协作框架,提供高可用,高性能,强一致等特性 zookeeper 有哪些应用场景? 分布式锁:分布式锁是指在分布式环境中,多个进程或线程需要互斥地访问某个共享…...
1. ELK Stack 理论篇之什么是ELK Stack?
ELK Stack 理论篇之什么是ELK Stack?1.1 什么是 ELK Stack?1.2 ELK Stack的发展史1.2.1 Elasticsearch1.2.2 引入 Logstash 和 Kibana,产品更强大1.2.3 社区越来越壮大,用例越来越丰富1.2.4 然后我们向 ELK 中加入了 Beats1.2.5 那么&#x…...
两道有关链表的练习
目录 一、分割链表 二、奇偶链表 一、分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输…...
Python uiautomator2安卓自动化测试
一、前言 uiautomator2是Python对Android设备进行UI自动化的库,支持USB和WIFI链接,可以实现获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。 重点是它可以实现安卓自动化采集,甚至是群控采集,且安装和…...
Leetcode. 160相交链表
文章目录指针解法指针解法 核心思路 : 先 分别求两个链表的长度 然后长的链表先走 差距步(长-短) 最后长链表和短链表同时走 ,第一地址相同的就是交点 ,注意一定是地址相同 不可能出现上图这种情况 ,因为C1…...
MDPs —— 马尔可夫决策定义与算法
文章目录MDPs 定义——由实例开始时序决策问题给游戏增点乐子*为什么要有折扣游戏的解——原则所以,什么是 MDPs?MDPs 的基本原理、表示光环原理效用的求解是反向传播的原则不变条件MDPs 的表示MDPs 求解效用迭代法缺点原则迭代法MDPs 定义——由实例开始…...
【C++】图
本文包含了图的基本概念 1.相关概念 1.1 无/有向 无向图:每一个顶点之间的连线没有方向 有向图:连线有方向(类似离散数学的二元关系 <A,B>代表从A到B的边,有方向) <A,B>中A为始点,B为终点在…...
尾递归优化
文章目录1. 前言2. 什么尾调用(Tail Call)?3. 尾调用优化4. Linux内核下的尾递归优化使用5. 参考资料1. 前言 限于作者能力水平,本文可能存在谬误,对此给读者带来的损失,作者不错任何承诺。 2. 什么尾调用…...
P1120 小木棍(搜索+剪枝)
题目链接:P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入: 9 5 2 1 5 2 1 5 2 1 样例输出: 6 分析:这道题一看数据范围就知道是搜索,但关键是需要剪枝。 首先我们求出所有木棍的长度和&am…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
