Linux网络序列化与反序列化

Linux网络序列化与反序列化

1. 前言

在网络通信中,互相通信的信息不一定都是字符串,往往一些结构化的信息也需要进行通信。理论上,只要服务器和客户端都自定义一个共同的协议,结构化的信息也能实现正常通信。但考虑到不同系统、不同版本的维护成本,网络通信一般不采取这种方式,而是将结构化的信息变成字符串堆在一起,称为序列化。将序列化的数据通过网络协议各层传输到另一端再对这个字符串进行拆分解析,称为反序列化。

使用系统调用接口进行网络通信时,不需要考虑数据碰撞。因为一个sockfd,代表一个链接,一个链接有两个缓冲区。系统调用的读写本质都是向TCP协议中的发送缓冲区和接受缓冲区拷贝数据,由于发送和接受的缓冲区不同,也就不用考虑同时发送和接受的数据碰撞问题。

Serialize1

2. 序列化与反序列化格式

在实践中,序列化包含的内容不止有数据化结构的信息,还应包含有数据信息的总体长度,以及用于区分各给内容的分隔符:

"len"\r\n"{json}"\r\n

“len”:是"{json}"的总长度,在网络通信中,传输过来的报文可能并不完整,如果“len”和实际长度不符,那么该报文应该舍弃而不解析。

\r\n:是用作为分隔符的符号,在网络通信中,相同报文可能会堆积。那么就需要分隔符来区分哪一部分是“len”那一部分是整体报文。

“{json}”:是序列化的数据化结构,jsoncpp库提供了对其进行解析的接口。

3. jsoncpp

jsoncpp是一个开源的第三方c++库,它可以用于生产.json文件,也提供了将数据序列化与反序列化的接口。在Linux系统中,使用该库需要先安装:

ubuntu: sudo apt-get install libjsoncpp-dev

centos: sudo yum install jsoncpp-devel

3.1 序列化与反序列化常用API

#include <jsoncpp/json/json.h>

3.2 Json::Value

Json::Value

Json::Value是一个类类型,其定义的对象一般取名为root,因为这是一个树状结构,且使用的是映射关系存储序列化数据。

Json::Value使用operator[]来存储keyvalue。其中key必须是字符串,而value则支持cpp的大部分原生类型及json形式的类型。示例:root["x"]=_x;

3.3 Json::FastWriter

Json::FastWriter

Json::String Json::FastWriter::write(const Json::Value &root)

Json::FastWriter是一个类类型,其定义的对象一般取名为writer,,write()是其成员函数,它将Json::Value对象存储的数据序列化为字符串,字符串的形式为 "{json}"

3.4 Json::Reader

Json::Reader

bool Json::Reader::parse(std::istream& is, Value& root, bool collectComments = true)

Json::Value::Int Json::Value::asInt() const

Json::Reader是一个类类型,其定义的对象一般取名为reader,它用于将序列化的数据反序列化。 parse()是其成员函数,它将传递进来的json序列化字符串 is,传输到Value对象 root中,随后指明 root中value的类型即可实现反序列化。

asInt()Value类中的一个成员函数,其在反序列化中,将特定的key对应的value指明类型提取出来,如该函数为将value按照int类型提取,示例:_x=root["x"].asInt();。类似的函数还有 asCstring()asString()asBool()asDouble()等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战经验:使用 Python 的 PyPDF 进行 PDF 操作

文章目录 1. 为什么选择 PyPDF&#xff1f;2. 安装 PyPDF3. PDF 文件的合并与拆分3.1 合并 PDF 文件3.2 拆分 PDF 文件 4. 提取 PDF 文本5. 修改 PDF 元信息6. PDF 加密与解密6.1 加密 PDF6.2 解密 PDF 7. 页面旋转与裁剪7.1 旋转页面7.2 裁剪页面 8. 实战经验总结 PDF 是一种非…

PhyCAGE:符合物理规律的图像到 3D 生成

Paper: Yan H, Zhang M, Li Y, et al. PhyCAGE: Physically Plausible Compositional 3D Asset Generation from a Single Image[J]. arXiv preprint arXiv:2411.18548, 2024. Introduction: https://wolfball.github.io/phycage/ Code: Unreleased PhyCAGE 是一种 image-to-3D…

游戏为什么失败?回顾某平庸游戏

1、上周玩了一个老鼠为主角的游戏&#xff0c;某平台喜1送的&#xff0c; 下载了很久而一直没空玩&#xff0c;大约1G&#xff0c;为了清硬盘空间而玩。 也是为了拔掉心中的一根刺&#xff0c;下载了而老是不玩总感觉不舒服。 2、老鼠造型比较写实&#xff0c;看上去就有些讨…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

5G 核心网 相关概念快速入门

在我们开始阅读3GPP协议来学习5G核心网之前&#xff0c; 不妨来看看我之前整理的PPT&#xff0c;快速学习核心网相关概念&#xff0c; 以及5G转发面PFCP协议的相关核心知识。 涵盖了最精简的核心骨干内容&#xff0c;助你轻松上阵。 讲解目标 3GPP和相关协议 5G核心网架构模…

2025/1/20 学习Vue的第三天

玩性太大了玩得也不开心&#xff0c;天天看电视刷视频。 内心实在空洞。 最近天天看小红书上的外国人&#xff0c;结实外国友人&#xff08;狗头&#xff09;哈哈哈认识了不少人&#xff0c;有埃及的有美国的&#xff0c;还有天天看菲利普吃糖葫芦哈哈哈哈哈一个阳光的德国大男…

虚幻基础1:hello world

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 hello world创建项目创建关卡创建蓝图将蓝图插入关卡中运行 hello world 本文引擎为5.5.1 创建项目 如图 创建后如图。 创建关卡 如图 创建蓝图 如图 选择actor 双击进入蓝图节点 选择事件图表 创…

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…

SparkSQL数据源与数据存储综合实践

文章目录 1. 打开项目2. 查看数据集2.1 查看JSON格式数据2.2 查看CSV格式数据2.3 查看TXT格式数据 3. 添加单元测试依赖4. 创建数据加载与保存对象4.1 创建Spark会话对象4.2 创建加载JSON数据方法4.3 创建加载CSV数据方法4.4 创建加载Text数据方法4.5 创建加载JSON数据扩展方法…

鸿蒙Harmony json转对象(1)

案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …

Maven私服-Nexus3安装与使用

写在前面 安装简单&#xff0c;此博客主要是为了记录下怎么使用&#xff0c;以及一些概念性的东西 安装配置 下载 下载对应版本&#xff08;科学上网&#xff09; https://help.sonatype.com/en/download-archives—repository-manager-3.html 设置端口 /etc/nexus-defaul…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 &#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;、微软研究院、斯坦福大学等机构共同创建的新型基础设施&#xff0c;目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准&#xff0c;调度多智…

【k8s面试题2025】2、练气初期

在练气初期&#xff0c;灵气还比较稀薄&#xff0c;只能勉强在体内运转几个周天。 文章目录 简述k8s静态pod为 Kubernetes 集群移除新节点&#xff1a;为 K8s 集群添加新节点Kubernetes 中 Pod 的调度流程 简述k8s静态pod 定义 静态Pod是一种特殊类型的Pod&#xff0c;它是由ku…

K8S-Pod资源清单的编写,资源的增删改查,镜像的下载策略

1. Pod资源清单的编写 1.1 Pod运行单个容器的资源清单 ##创建工作目录 mkdir -p /root/manifests/pods && cd /root/manifests/pods vim 01-nginx.yaml ##指定api版本 apiVersion: v1 ##指定资源类型 kind: Pod ##指定元数据 metadata:##指定名称name: myweb ##用户…

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…

深度学习 DAY1:RNN 神经网络及其变体网络(LSTM、GRU)

实验介绍 RNN 网络是一种基础的多层反馈神经网络&#xff0c;该神经网络的节点定向连接成环&#xff0c;其内部状态可以展示动态时序行为。相比于前馈神经网络&#xff0c;该网络内部具有很强的记忆性&#xff0c;它可以利用它内部的记忆来处理任意时序的输入序列&#xff0c;…

svn tag

一般发布版本前&#xff0c;需要在svn上打个tag。步骤如下&#xff1a; 1、空白处右击&#xff0c;选择TortoiseSVN->Branch/tag; 2、填写To path&#xff0c;即tag的路基以及tag命名&#xff08;一般用版本号来命名&#xff09;&#xff1b;填写tag信息&#xff1b;勾选cr…

Astropay之坑

大家可能知道 Astropay 原来在日本也有业务&#xff0c;后来突然有一天业务关掉了&#xff0c;那里面的用户的钱当然也就取不出来了嘛。 我合计那就那么放着呗&#xff0c;等以后你们重返日本的时候我再去取嘛。 嗨&#xff0c;最近收到几个邮件&#xff0c;可把我气笑了。 简…

(7)(7.2) 围栏

文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形&#xff08;“TinCan”&#xff09;和多边形和/或圆柱形、…