当前位置: 首页 > news >正文

【网络】自定义协议 | 序列化和反序列化 | Jsoncpp

本文首发于 慕雪的寒舍

以tcpServer的计算器服务为例,实现用jsoncpp来进行序列化和反序列化

阅读本文之前,请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例

1.安装jsoncpp

我所用的系统是centos7.6,先用下面的命令查找相关的包

sudo yum list | grep jsoncpp-devel

显示出来的包如下

Repository epel is listed more than once in the configuration
jsoncpp-devel.x86_64                0.10.5-2.el7           @epel 

随后安装这个包

sudo yum install jsoncpp

不知道为什么,安装jsoncpp-devel.x86_64显示找不到相关包

或者采用下面的两个命令

sudo yum install epel-release
sudo yum install jsoncpp-devel

如果执行完毕后显示找不到jsoncpp,尝试重新安装epel-release

image-20230404123816637

刚开始我显示epel已经安装,但是找不到jsoncpp这个包,我在重新安装了epel后就能正常安装了

sudo yum rm epel-release
sudo yum install epel-release
sudo yum install jsoncpp-devel

如下图,正常查找到并安装完毕

image-20230404123834144

在centos8下,安装完毕后路径如下

$ ls /usr/include/json
allocator.h  assertions.h  autolink.h  config.h  features.h  forwards.h  json.h  reader.h  value.h  version.h  writer.h

1.1 什么是json?

json是一个kv键值对的序列化方式,每一个key都对应了一个value

{"data": "value"
}

这就有点类似c++中的map,不过json能做的更多

{"data1": "value","data2": {"key1":"value1","key2":"value2","key3":0,"key4":true}
}

json可以在里面嵌套添加更多的内容,不管是字符串还是整形,还能是bool类型的true/false

因为json对反序列化序列化的控制很是不错,可读性也很好,所以被广泛使用!

相比于自己写一个序列化方式,直接用别人的轮子,也不错👻

类似的序列化框架还有xml

2.代码示例

2.1 序列化

相比我们自己写的序列化方式,json的使用简单多了

void serialize(std::string& out)
{//使用jsoncpp的代码Json::Value root;root["x"] = _x;root["y"] = _y;root["op"] = _ops;Json::FastWriter fw; // 这个是写成一行,对于计算机来说处理的负担小// Json::StyledWriter fw; // 这个会进行格式化,更好看(但是内容没差距)out = fw.write(root);
}

对于fw.write(root),其返回值是一个string,也方便我们接收

image-20230212135543386

其中FastWriterStyledWriter有一点区别,如下

//FastWriter
{"data": "value"}
//StyledWriter
{"data": "value"
}

简单来说,StyledWriter会对我们的kv键值对进行格式化,更方便人类的阅读。而FastWriter是直接写成一整行,在传输的时候会方便一点(因为不需要\n

2.2 反序列化

反序列化需要一个Reader来读取字符串,并将其内容根据键值隐射给成员变量

bool deserialize(const std::string &in)
{//jsonJson::Value root;Json::Reader rd;rd.parse(in, root);_x = root["x"].asInt();_y = root["y"].asInt();_ops = root["op"].asInt();
}

3.测试

因为jsoncpp是一个第三方库,我们链接的时候需要加上命令-ljsoncpp

tcpServer:tcpServer.cppg++ -o $@ $^ -std=c++11 -lpthread -ljsoncpp

发送消息后,可以看到,json帮我们格式化为如下形式的字符串

{"op":43,"x":1,"y":200}
{"op":43,"x":333,"y":234}

image-20230212140924067

4.gcc给予宏定义

为了方便对序列化采用的方式进行控制,这里我使用了预处理指令ifdef/endif来进行判断,只要我们在文件头定义了MYPROTOCOL,这里就会采用我们自己的写的序列化方式,否则采用json

#define MYPROTOCOL 1  //如果define了这个,那就使用自己的代码

image-20230212182113854

4.1 命令行

但是在文件里面修改define还是不太方便,我们可以直接采用gcc的命令行参数的方式,进行define的插入(这么做之前,要先删除文件中对MYPROTOCOL的define)

g++ -DMYPROTOCOL tcpServer.cpp -o tcpServer -lpthread -ljsoncpp
g++ -DMYPROTOCOL tcpClient.cpp -o tcpClient -lpthread -ljsoncpp

可以看到,不加编译指令编译出来的服务器,采用的是json的方式来序列化

image-20230212182627766

添加了之后,就是用我们自己写的序列化方式来序列化了

image-20230212182919150

4.2 makefile

因此,我们可以修改makefile来实现这一点

.PHONY:all
all:tcpClient tcpServer
MYSELF=-DMYPROTOCOLtcpClient: tcpClient.cppg++ $(MYSELF) -o $@ $^ -std=c++11 -lpthread -ljsoncpp
tcpServer:tcpServer.cppg++ $(MYSELF) -o $@ $^ -std=c++11 -lpthread -ljsoncpp.PHONY:clean
clean:rm -f tcpClient tcpServer

当我们需要用自己协议的时候,就在最前面加上

MYSELF=-DMYPROTOCOL

否则直接删除这个定义,或者注释掉后面的内容,就能采用jsoncpp

MYSELF=#-DMYPROTOCOL

这样就方便一些了

image-20230212183456024

相关文章:

【网络】自定义协议 | 序列化和反序列化 | Jsoncpp

本文首发于 慕雪的寒舍 以tcpServer的计算器服务为例,实现用jsoncpp来进行序列化和反序列化 阅读本文之前,请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例 1.安装jsoncpp 我所用的系统是centos7.6,先用下面的命令查找相关的包 …...

PHP实践:用openssl打造安全可靠的API签名验证系统

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目: 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 示例1 输入:s "abaccdeff" 输出:b 示例2 输入:s "" 输出: 提示 0 …...

【第五章 flutter学习之flutter进阶组件-下篇】

文章目录 一、Scaffold属性二、TabBar三、路由四、AlertDialog、SimpleDialog、showM...五、PageView六、Key七、AnimatedList八、动画 一、Scaffold属性 Flutter Scaffold 是一个用于构建基本用户界面的布局组件。它提供了许多属性,使得开发者能够轻松地创建一个完…...

单元测试和集成测试有什么区别

单元测试和集成测试有什么区别 单元测试和集成测试是软件开发中的两个重要测试阶段,它们的主要区别如下: 目的: 单元测试:主要针对代码的最小可测试单元,通常是一个函数或方法,确保它按照预期工作。集成…...

如何实现基于场景的接口自动化测试用例?

自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。 基于这个想法,我们的接口自动化测试思路如下…...

SAP 开发编辑界面-关闭助手

打开关闭助手时的开发界面如下: 关闭关闭助手后的界面如下: 菜单栏: 编辑--》修改操作--》关闭助手...

【el-image图片查看时 样式穿透表格问题】

element-ui el-image图片查看 样式混乱 解决方式 ::v-deep(.el-table__cell) {position: static !important; // 解决el-image 和 el-table冲突层级冲突问题 }加个样式即可...

GPT带我学-设计模式-模板模式

1 请你给我介绍一下设计模式中的模板模式 模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式允许子类重新定义算法的某些特定步骤,而不需要改变算法的结构。 模板模式由以下几个角色组成&…...

Windows下调试UEFI程序:Visual Studio调试

以edk2\MdeModulePkg\Application\HelloWorld这个项目作为调试目标。 1. 使用VS2017建立Makefile工程 VS2017, 新建 project,取名X64dbg_vs。 Visual C > Other > Makefile Project, 注意项目路径为HelloWord程序路径。 随便填写config中的字符串&#xff…...

Vue中监听路由参数变化的几种方式

目录 一. 路由监听方式: 通过 watch 进行监听 1. 监听路由从哪儿来到哪儿去 2. 监听路由变化获取新老路由信息 3. 监听路由变化触发方法 4. 监听路由的 path 变化 5. 监听路由的 path 变化, 使用handler函数 6. 监听路由的 path 变化,触发method…...

angular——子组件如何接收父组件的动态传值

开发过程中,父组件给子组件传值的情况很常见,今天我们就来聊聊父组件给子组件传值可能会发生哪些意外,什么情况下子组件无法接收到父组件最新的传值; 传值情况: 基本数据类型:父组件给子组件传递 基本数据…...

php 桥接模式

一,桥接模式,是结构设计模式的一种,其将抽象部分和实现部分分离开来,使两部分可以独立的进行修改,提高系统的灵活性。在桥接模式中,需要定义一个抽象类和一个实现类,通过将实现类注入到抽象类中…...

Android 13 Hotseat定制化修改——004 hotseat布局位置

目录 一.背景 二.原生hotseat布局位置 三.修改Hotseat布局位置 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat…...

海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码

海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码...

洛谷P1162 - 填涂颜色

题目描述 由数字 0 0 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 1 1 构成,围圈时只走上下左右 4 4 4 个方向。现要求把闭合圈内的所有空间都填写成 2 2 2。例如: 6 6 6\times 6 66 的方阵( n 6 n6 n6&…...

设计模式十一:外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户…...

GIS和倾斜摄影的关系?

GIS(地理信息系统)和倾斜摄影是两种在地理空间数据处理和分析中扮演重要角色的技术。但是我们总是会分不清二者,本文就带大家从不同角度了解二者之间的关系。 概念 GIS是一种用来捕获、存储、分析和展示地理空间数据的技术,它可以…...

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织,只要有写代码的地方,就有代码版本管理的主场,初入职场,总会遇到第一个拦路虎 git 管理流程,但是每一个企业似乎都有自己的 git 管理流程,倘若我们能掌握…...

LeetCode105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 文章目录 [105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)一、题目二、题解 一、题目 给定两个整数数组 preorder 和 inorder ,其中 preo…...

告别旋转锚点!用Oriented R-CNN在DOTA数据集上轻松实现高精度遥感目标检测(附开源代码)

突破传统限制:Oriented R-CNN在遥感目标检测中的实战指南 遥感图像中的目标检测一直是计算机视觉领域的难点之一。不同于常规图像中的物体,遥感目标往往以任意角度出现,传统水平边界框检测方法难以准确捕捉其空间位置。想象一下,…...

利用快马AI平台,十分钟为小龙虾openclaw机械爪搭建可运行原型

最近在折腾一个开源机械爪项目——小龙虾openclaw,需要快速验证硬件设计和控制逻辑。传统开发流程从写代码到烧录测试至少半天起步,但这次尝试用InsCode(快马)平台做原型开发,居然十分钟就搞定了可运行版本!记录下这个高效的工作流…...

3dsconv高效使用指南:从格式难题到批量转换的实用方案

3dsconv高效使用指南:从格式难题到批量转换的实用方案 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 解决3DS游…...

EC2Instances.info未来发展规划:AI驱动的智能实例推荐系统

EC2Instances.info未来发展规划:AI驱动的智能实例推荐系统 【免费下载链接】ec2instances.info Amazon EC2 instance comparison site 项目地址: https://gitcode.com/gh_mirrors/ec/ec2instances.info EC2Instances.info作为专业的Amazon EC2实例比较平台&a…...

QuickBMS深度解析:游戏资源逆向工程与批量处理技术实践

QuickBMS深度解析:游戏资源逆向工程与批量处理技术实践 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 作为游戏逆向工程领域的瑞士军刀,QuickBMS以其卓越的文件格式解析…...

EVA-02模型辅助软件测试:自动化生成测试用例与边界条件描述

EVA-02模型辅助软件测试:自动化生成测试用例与边界条件描述 如果你是一名软件测试工程师,下面这个场景你一定不陌生:产品经理递过来一份几十页的需求文档,你需要在几天内,把它拆解成成百上千条逻辑清晰、覆盖全面的测…...

探索音乐资源获取:如何通过开源工具畅享高品质音乐体验

探索音乐资源获取:如何通过开源工具畅享高品质音乐体验 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 在数字音乐时代,寻找稳定、免费且高质量的音乐资源成为许多音乐爱好…...

Gemma-3-270m内网穿透部署方案

Gemma-3-270m内网穿透部署方案:安全打通企业AI服务 想象一下这个场景:你们公司的研发团队刚刚在内部服务器上部署了轻量高效的Gemma-3-270m模型,准备用它来优化客服工单分类、自动生成产品文档。模型跑起来了,效果也不错&#xf…...

Hunyuan-MT-7B开源镜像免配置部署:像素语言传送门一键启动教程(含GPU适配)

Hunyuan-MT-7B开源镜像免配置部署:像素语言传送门一键启动教程(含GPU适配) 1. 项目介绍 像素语言跨维传送门是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。它将传统翻译体验重构为16-bit像素冒险风格,让语言转换变…...

别再死记硬背公式了!用Simulink玩转单相全桥逆变,从方波驱动到IGBT参数设置全解析

用Simulink玩转单相全桥逆变:从方波驱动到IGBT参数设置的实战指南 电力电子领域的学习常常陷入公式推导的泥潭,而Simulink提供的可视化仿真环境就像一盏明灯。想象一下,当你调整一个参数就能立即看到波形变化,比纸上推导要直观十倍…...