C++ 轻量级对象JSON序列化实现

Apollo 3.5 Cyber base代碼學習 Apollo 3.5 Cyber base代碼學習`cyber/base/macros.h``cyber/base/atomic_fifo.h``cyber/base/for_each.h``cyber/base/wait_strategy``cyber/base/atomic_hash_map.h``cyber/base/rw_lock_guard``cyber/base/atomic_rw_l... 阅读详情

背景:

在项目里经常遇到对象和json字符串的相互转换这类问题,在大多数程序里,一般这个问题都比较有比较好的解决方法,往往一个函数搞定。但是到了c++这边却需要我们手撸json库一个一个字段初始化/序列化。如果这时候有一个函数 可以一行代码 unmarshal /marshal 对象岂不是很方便?本文以jsoncpp库为基础,设计这样一个可以支持这种功能的函数,下面进入正题~

设计思路

以unmarshal 为例,我们最终的函数是打造两个这样的模板函数 :

一个从string 的josn直接反序列化对象,一个从jsoncpp库的json对象,反序列化对象。

template<typename T> bool Unmarshal(T& obj,const string& json_str);
template<typename T> bool Unmarshal(T& obj,const Json::Value& json_obj_root);

由于json是具有自递归结构的,所以在设计时,应该也是以递归的方式解决复杂的组合类,我们可以简单的把程序中的变量分为下面几类:

在这里插入图片描述
这样我们只需要把这几个场景的 Unmarshal实现了,整体的Unmarshal也就实现了。模板设计的类图应该和我们的分类相对应:
在这里插入图片描述
在实现中要注意以下几点:

1、每个分类的Unmarshal模板具有排他性,也就是说基本类型在编译期间只能匹配解析基本类型的模板

2、由于1的保证和这些模板函数名称都是Unmarshal,所以他们之间可以相互嵌套调用对方。

3、指针、和原生数组会涉及到空间分配和长度检测会使得情况变得复杂,本次设计支持的范围不包含对指针、原生数组的支持。

匹配基本类型的Unmarshal模板

//只能解析基本类型 int long bool float double string 的一组模板
/*
 * 其实可声明为重载函数,声明为模板只是为了可以放在头文件中
 * 不能声明为 template <typename T> bool Unmarshal(int& obj,const Json::Value &root);是因为 
 * 在编译时编译器不能推断出T的类型,导致编译失败.所以将模板类型列表设置为template <int = 0> (Nontype 
 * Parameters) 此处int并无实际意义
 */
template <int = 0> 
inline bool Unmarshal(int& obj,const Json::Value &root){
    if(!root.isIntegral())
        return false;
    obj = root.asInt();
    return true;
}

template <int = 0>
inline bool Unmarshal(long& obj,const Json::Value &root)

.....

匹配stl容器/其他第三方类库的Unmarshal模板

//只能匹配 vector<T> map<string,T> map<long,T> map<int,T> 的一组模板
//vector
template <
C++对象与Json格式的序列化与反序列化技术详解 在软件开发领域,数据的持久化和网络传输是两个重要的应用场景。序列化和反序列化则是实现数据持久化和网络传输的关键技术。序列化是指将对象状态信息转换为可以存储或传输的形式的过程。这个过程通常涉及到将复杂的数据结构或对象状态转换为扁平化的二进制格式、文本格式,甚至是XML或JSON格式的数据。反序列化则是序列化的逆过程,它将序列化后的数据转换回原始的对象结构。理解序列化与反序列化的概念,对于开发人员来说至关重要,因为这一技术是现代软件系统中不可或缺的一部分。 阅读详情

相关推荐

C++中的JSON数据序列化与反序列化实现

JavaScript Object Notation(JSON)最初由Douglas Crockford于2001年提出,目的是为了简化Web应用中的数据传输。作为一种轻量级的数据交换格式,JSON迅速在各种编程语言中获得支持,成为API设计的首选格式。使用标准库方法与自定义方法相比,有一个明显的优势:它们的使用相对简单,不需要引入外部依赖。然而,当遇到复杂的数据结构和频繁的序列化反序列化操作时,这种自定义方法的缺点就暴露无遗:代码的可维护性和可扩展性会受到严重影响。优点。

weixin_36487018的博客 1209

Pinocchio 安装教程|机器人学的必备库

安装pinocchio,不要安装pip3 install pinocchio!

darcsdn 1660

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4064

TouchGFX使用教程(三)

TouchGFX使用教程(三)界面事件控件修改方法图片等资源放置位置 界面事件 控件修改方法 图片等资源放置位置

yuanzhan11的专栏 6972

lift off工艺为什么常用蒸发的方式镀膜?

电子束蒸发中,蒸发物质从源头直接升华并沿直线路径沉积到晶圆上,它可以避免金属在掩模侧壁的覆盖,只在表面进行沉积。在镀膜结束后,在进行光刻胶剥离时,去胶液无法与光刻胶接触反应,导致光刻胶剥离很困难。欢迎加入我的半导体制造知识星球社区,目前社区有1900人左右。我观察到晶圆厂中lift off工艺,镀膜都是用的电子束蒸发的方式,很少有用磁控溅射的方式,为什么?需要增加撕胶工序,将胶面上覆盖的膜层撕掉,使光刻胶露出,这样才容易剥离。上图为磁控溅射的膜层截面图,去胶液很难突破侧壁膜层,进行反应。

1685

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2474

国科大学习资料--模式识别与机器学习(黄庆明)--2020期末考试题

国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 ============================================================================================================================================================

无名何许人的博客 2601

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 844

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Spring Data JPA的简单入门
下一篇: 技术的本质与启示
「已注销」
博客等级 码龄6年 395粉丝 158原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值