【Linux网络编程】序列化与反序列化
目录
一,序列化和反序列化的说明
二,Jsoncpp库的介绍
三,Jsoncpp库的使用
3-1,Json::Value类
3-2,Json::StreamWriter类
3-3,Json::CharReader类
一,序列化和反序列化的说明
序列化与反序列化主要用于对象的存储与传输。
序列化和反序列化主要涉及到将数据(通常是内存中的对象)转换为一种格式,以便可以存储或传输,然后再将这种格式转换回原始的数据形式,以便读取原本信息。
序列化就是把内存中的对象(比如一个包含多个属性和方法的对象)转换成一个字节流(或字符串等),能够方便存储和传输的格式,这个字节流包含了对象的所有信息。这样做的目的是方便存储(比如保存到文件或数据库中)或传输(比如通过网络发送给另一台计算机)。
反序列化就是把之前序列化得到的字节流(或者字符串等格式)重新转换回原来的对象。在这个过程中,从存储区或传输流中读取对象的状态信息,并重新构建对象,从而恢复对象的状态和行为。这样,对象就可以在另一台计算机上被恢复和使用。在网络传输或持久化存储场景中,反序列化是获取对象的必要步骤。
模拟实现序列化与反序列化一般是将对象(比如一个类)中的所有要发送的信息存储到一个字符串里进行发送,即序列化;接收方接收到这里字符串后会将其还原成原本的对象形式读取,即反序列化。
二,Jsoncpp库的介绍
Jsoncpp是一个用于处理JSON数据的C++库。
这里先来说明下JSON。JSON是一种数据格式,它采用完全独立于语言的文本格式来存储和表示数据。JSON数据的基本结构有两种:对象和数组。
-
对象:对象在JSON中表示为无序的键值对集合,使用花括号
{}
括起来。每个键值对之间使用逗号‘,’
分隔,键和值之间使用冒号:
分隔。键必须是字符串,值可以是字符串(用常规双引号 "" 括起来表示)、数字(数字包括整形和浮点型,直接使用)、对象、数组(用中括号 [] 括起来表示)、布尔值或null。
示例:
C代码表示:
char* name = "John";
int age = 30;
char* city = "New York";
Json表示:
{ "name": "John", "age": 30, "city": "New York" }
-
数组:数组在JSON中表示为有序的值列表(键只能是字符串),使用方括号
[]
括起来。每个值之间使用逗号‘,’
分隔。数组的值可以是任何JSON支持的数据类型,包括对象,如下:
示例:
{
"姓名" : "xx",
"年龄" : 18,
"成绩" : [88.5, 99, 58],
"爱好" :{
"书籍" : "西游记",
"运动" : "打篮球",
"游戏" : [ { "苹果" : "a", "安卓" : "b" }, { "Linux" : "c", "Windows" : "d" } ]
}
}
Jsoncpp库主要提供两个核心功能:1,将C++中的数据结构(如对象、数组等)序列化为JSON格式的字符串。2,将JSON格式的字符串反序列化。
Jsoncpp库默认是没有的,若要使用需要安装此库,Ubuntu/Centos系统的安装指令如下:
Ubuntu系统:sudo apt install libjsoncpp-dev
Centos系统:sudo yum install jsoncpp-devel
安装完后我们可在 /usr/include/ 路径下看到 jsoncpp目录,里面包含 json目录,json目录中包含各种头文件,我们使用的头文件是<json.h>,其它的基本用不到,即运用Jsoncpp库时,只需要加入<jsoncpp/json/json.h>头文件即可。
三,Jsoncpp库的使用
Jsoncpp 库主要借助Json::Value、Json::StreamWriter、Json::CharReader三个类以及其对应的少量成员函数完成序列化及反序列化。
3-1,Json::Value类
Json::Value类是用于存储和管理Json数据的类,该类是一种中间数据存储类,即若要将数据对象进行序列化,就需要先存储到Json::Value对象中;若要将Json数据反序列化,就需要将解析后的数据对象存储到Json::Value对象中。下面来说明该类常用的成员函数功能,结构如下:
class Json::Value {
// Value重载了[]和=,因此所有的赋值和获取数据都可以通过,即完成 val["name"] = "xx" 的功能
Value &operator=(const Value &other);
Value& operator[](const std::string& key);
Value& operator[](const char* key);
Value removeMember(const char* key); //移除值为key的元素
// ArrayIndex是Jsoncpp库中自定义整形的数据类型,它用来表示数组的下标
const Value& operator[](ArrayIndex index) const; // 完成对数组中元素的访问,即val["score"][0],访问score对应0下标的元素
Value& append(const Value& value); // 向数组中添加元素,即val["score"].append(88);
ArrayIndex size() const; // 获取数组元素个数 val["score"].size();
std::string asString() const; // 将‘值’数据转成string型,即string name = val["name"].asString();
const char* asCString() const; // 将‘值’数据转成char*型,即char *name = val["name"].asCString();
Int asInt() const; // 将‘值’数据转成int型,即int age = val["age"].asInt();
float asFloat() const; // 将‘值’数据转成float型,即float weight = val["weight"].asFloat();
bool asBool() const; // 将‘值’数据转成bool型,即bool ok = val["ok"].asBool();
.....这里还可以转换成其它常用数据类型,这里不再展示
};
3-2,Json::StreamWriter类
Json::StreamWriter类用于将Json字符串格式的数据序列化,该类功能依靠类内部的write函数(Json::StreamWriter::write())。但该类是一个抽象类,不能实例化出对象,该类是通过被Json::StreamWriterBuilder类继承完成序列化的功能。Json::StreamWriterBuilder类是Json::StreamWriter类的工厂类,它内部存在newStreamWriter用于动态构建出Json::StreamWriter对象的成员函数。具体形式如下:
class JSON_API StreamWriter {
virtual int write(Value const& root, std::ostream* sout) = 0; // 将Json格式的Value对象(Json::Value类对象)root进行序列化,并将其写入到指定输出流对象的地址中,成功时该函数返回0,失败的情况比较复杂,这里不做说明。
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
virtual StreamWriter* newStreamWriter() const; // 动态开辟出StreamWriter对象
}
3-3,Json::CharReader类
Json::CharReader类用于将Json数据格式反序列化。该类的功能是靠成员函数Json::CharReader::parse()实现的。与Json::StreamWriter类一样,该类也是一个抽象类,通过被Json::CharReaderBuilder类继承完成其实例化,具体说明如下:
class JSON_API CharReader {
virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
/* beginDoc是指向JSON字符串开始的指针;
endDoc是指向JSON字符串结束的指针;
root是一个指向Json::Value对象的指针,用于存储解析后的JSON数据;
errs是一个指向std::string对象的指针,用于存储错误信息。
该函数是将一个存储序列化的字符串进行反序列化,将其存储到一个指向Value对象的指针中
成功时该函数返回true;失败时返回false */
}
class JSON_API CharReaderBuilder : public CharReader::Factory {
virtual CharReader* newCharReader() const; // 动态开辟出CharReade对象
}
Jsoncpp的代码运用请在此链接下观看:Jsoncpp的代码运用
相关文章:
![](https://i-blog.csdnimg.cn/direct/cd6237b600db44d8aeb86030cb07379b.png)
【Linux网络编程】序列化与反序列化
目录 一,序列化和反序列化的说明 二,Jsoncpp库的介绍 三,Jsoncpp库的使用 3-1,Json::Value类 3-2,Json::StreamWriter类 3-3,Json::CharReader类 一,序列化和反序列化的说明 序列化与反…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot中的自动配置原理是什么
Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置,通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置,Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…...
![](https://www.ngui.cc/images/no-images.jpg)
大模型相关资料、基础技术和排行榜
大模型排行榜 测试集CEval中文多个学科测试集排名MMLU大规模多任务语言理解英文排名,介绍斯坦福排行榜Math-VMath-VistaOpen LLMs LeaderboardCMMLU 大模型数据集 标题简介19个大模型常用的评估数据集和训练数据集汇总19个大模型常用的评估数据集和训练数据集汇总最…...
![](https://www.ngui.cc/images/no-images.jpg)
如何安装cnpm
今天尝试用npm install安装一个项目的依赖,但是无论如何都不能完成,等待时间非常久,所以同事推荐了cnpm,确实非常好用,所以推荐了出来,希望能给大家带来帮助。 cnpm 是中国淘宝团队提供的一个 npm 镜像工具…...
![](https://www.ngui.cc/images/no-images.jpg)
正则表达式 匹配特定字符后的所有字符
在处理文本数据时,正则表达式(RegularExpressions,简称Regex)是一种非常强大的工具,它可以用来搜索、匹配和替换文本中符合特定模式的字符串。 首先,明确我们的目标是匹配完整的URL,并获取它之…...
![](https://i-blog.csdnimg.cn/direct/4ce7ab7b9e854131bae00e6067575136.png)
计算机网络 (44)电子邮件
一、概述 电子邮件(Electronic Mail,简称E-mail)是因特网上最早流行的应用之一,并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网,实现了信息的快速、便捷传递。与传统的邮政系统相比&#…...
![](https://www.ngui.cc/images/no-images.jpg)
数据结构与算法:动态规划dp:理论基础和相关力扣题(509.斐波那契数列、70.爬楼梯)
1.0.理论基础 动态规划主要解决的问题种类有: 背包问题打家劫舍股票问题子序列问题 解决步骤: dp数组及其下标的意义递推公式dp数组初始化遍历顺序打印dp数组 2.0.相关力扣题 509.斐波那契数列 class Solution:def fib(self, n: int) -> int:i…...
![](https://i-blog.csdnimg.cn/direct/f6f0582094994534931c3dd7a52220b4.png)
某政务行业基于 SeaTunnel 探索数据集成平台的架构实践
分享嘉宾:某政务公司大数据技术经理 孟小鹏 编辑整理:白鲸开源 曾辉 导读:本篇文章将从数据集成的基础概念入手,解析数据割裂给企业带来的挑战,阐述数据集成的重要性,并对常见的集成场景与工具进行阐述&…...
![](https://i-blog.csdnimg.cn/direct/4cdde240770f40438a35f7cff8ec5d02.png)
word-break控制的几种容器换行行为详解
word-break 属性在控制换行行为时需要根据语言判断,对于中文 一个字符就是一个单词,字符换行不影响阅读理解,而对于英文来说,多个连续的字符才会是一个单词,例如中文的 早 英文为 morning。 morning7个字符才算一个单词…...
![](https://i-blog.csdnimg.cn/direct/f27fb7842c214b3ab3156c0728ce9c20.png)
【0x0084】HCI_Set_Min_Encryption_Key_Size命令详解
目录 一、命令概述 二、命令格式及参数 2.1 HCI_Set_Min_Encryption_Key_Size命令格式 2.2. Min_Encryption_Key_Size 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令的执行流程 4.1. 主机端准备阶段 4.2. 命令发送阶段 4.3. 控制器接收和…...
![](https://i-blog.csdnimg.cn/direct/daa8bb9f4b5a49cebbdd76b6290da8fb.gif)
关于2025年智能化招聘管理系统平台发展趋势
2025年,招聘管理领域正站在变革的十字路口,全新的技术浪潮与不断变化的职场生态相互碰撞,促使招聘管理系统成为重塑企业人才战略的关键力量。智能化招聘管理系统平台在这一背景下迅速崛起,其发展趋势不仅影响企业的招聘效率与质量…...
![](https://img-blog.csdnimg.cn/img_convert/de804f59eae86a2098b0f526029b6564.png)
Docker部署Spring Boot + Vue项目
目录 前提条件 概述 下载代码 打开代码 Docker创建网络 MySQL容器准备 MySQL数据库配置 启动MySQL容器 测试连接MySQL 初始化MySQL数据 Redis容器准备 修改Redis配置 启动redis容器 部署后端 后端代码打包 上传jar包到Linux 创建Dockerfile 构建镜像 运行后…...
![](https://i-blog.csdnimg.cn/direct/ce470bb3f9f84caa947fba290e53d505.png)
开发规范
开发规范 企业项目开发有2种开发模式:前后台混合开发和前后台分离开发。 前后台混合开发 顾名思义就是前台后台代码混在一起开发,如下图所示: 这种开发模式有如下缺点: 沟通成本高:后台人员发现前端有问题…...
![](https://i-blog.csdnimg.cn/direct/a5e49f4a6acb49b1ac5ccc488319d8ae.png)
九 RK3568 android11 MPU6500
一 MPU6500 内核驱动 1.1 查询设备连接地址 查看原理图, MPU6500 I2C 连接在 I2C4 上, 且中断没有使用 i2c 探测设备地址为 0x68 1.2 驱动源码 drivers/input/sensors/gyro/mpu6500_gyro.c drivers/input/sensors/accel/mpu6500_acc.c 默认 .config 配置编译了 mpu6550 …...
![](https://i-blog.csdnimg.cn/blog_migrate/8b83712dbb01f62c5b19e1c16ba9cf5a.jpeg)
openplant实时数据库(二次开发)
资源地址 我的网盘〉软件>数据库>openplant>openplant实时数据库(二次开发)...
![](https://i-blog.csdnimg.cn/direct/d16b38383c2b4256abdcdbd7afa777cb.png)
C语言:-三子棋游戏代码:分支-循环-数组-函数集合
思路分析: 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数,使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?be=1&origin_url=https://admin.nimbusyun.com/files/78b8f0de-c8d3-4209-997a-02ef27731899.jpeg)
“AI智慧化服务系统:未来生活的智能管家
在当今快速发展的科技时代,人工智能(AI)正以前所未有的速度改变着我们的生活。AI智慧化服务系统作为这一变革的前沿技术,正在逐渐成为我们未来生活的智能管家。它们不仅提高了服务效率,还为我们带来了更加个性化和便捷…...
![](https://i-blog.csdnimg.cn/direct/60c25bc9c7b440daa10cd33db77ec436.png)
python管理工具:conda部署+使用
python管理工具:conda部署使用 一、安装部署 1、 下载 - 官网下载: https://repo.anaconda.com/archive/index.html - wget方式: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…...
![](https://www.ngui.cc/images/no-images.jpg)
minio https配置
minio启动时候指定数据目录,配置文件,密钥文件目录,环境文件 1.创建minio用户,专门用于服务启动的 groupadd -r minio-user useradd -M -r -g minio-user minio-user 2.在当前用户目录下创建minio目录,存储minio相关文件 mkdir minio 在mini…...
![](https://i-blog.csdnimg.cn/direct/89a7e7bc574048ec894c51998a0bf726.png)
SpringMVC——原理简介
狂神SSM笔记 DispatcherServlet——SpringMVC 的核心 SpringMVC 围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器(即不同的Servlet)。根据请求的url,分配到对应的Servlet接口。 当发起请求时被前置的控制…...
![](https://i-blog.csdnimg.cn/direct/f10e63c2a206457195b9523a44120710.png)
Ubuntu18.04 解决 libc.so.6: version `GLIBC_2.28‘ not found
Glibc(GNU C Library)是 GNU 系统及其衍生系统如 Linux 操作系统中实现 C 语言标准库的核心组件。升级 Glibc 是一个非常谨慎的操作,因为它与系统的许多关键功能和服务密切相关。Ubuntu 18.04 默认安装的 Glibc 版本为 2.27,但某些…...
![](https://i-blog.csdnimg.cn/direct/50e925d8849e498c9fbe9e8ce6bff531.png)
Notepad++移除所有空格
1.打开Notepad。 2.打开你想要编辑的文件。 3.按下 Ctrl H 打开查找和替换对话框,并选择 “正则表达式”。 4.在 “查找目标” 框中输入 \s。 5.在 “替换为” 框中留空,不填写任何内容。 6.点击 “全部替换” 按钮。...
![](https://i-blog.csdnimg.cn/direct/04eb17068729410bad6a183bbac6433d.png)
Android BottomNavigationView不加icon使text垂直居中,完美解决。
这个问题网上千篇一律的设置iconsize为0,labale固定什么的,都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果:垂直方向,文本不居中,看着很难受 问题解决之后:舒服多了 其实很简单&…...
![](https://www.ngui.cc/images/no-images.jpg)
如何使用 `forEach` 遍历数组?
数组遍历相关问题:如何使用 forEach 遍历数组? 在 JavaScript 中,遍历数组是一个常见且必要的操作。数组提供了多种方法来进行遍历,其中 forEach 是一种非常方便且常用的方法。它可以轻松地对数组中的每个元素执行回调函数。理解…...
![](https://www.ngui.cc/images/no-images.jpg)
Go语言之路————条件控制:if、for、switch
Go语言之路————if、for、switch 前言ifforswitchgoto和label 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程࿰…...
![](https://i-blog.csdnimg.cn/direct/53298baedc54404790dcf0ee1f55989a.png)
OpenAI推出首个AI Agent!日常事项自动化处理!
2025 年1月15日,OpenAI 正式宣布推出一项名为Tasks的测试版功能 。 该功能可以根据你的需求内容和时间实现自动化处理。比方说,你可以设置每天早晨 7 点获取天气预报,或定时提醒遛狗等日常事项。 看到这里,有没有一种熟悉的感觉&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Go语言的编程范式
Go语言的编程范式 引言 Go语言,又称为Golang,由Google于2007年开发并于2009年开放源代码。Go语言被设计成一种简洁、高效且适用于多核计算和网络编程的语言。其独特的并发模型、静态类型系统以及高效的性能,使其在现代软件开发中逐渐获得了…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在 Rocky Linux 上安装极狐GitLab?
本文分享如何在 Rocky Linux 操作系统上安装极狐GitLab。 相关资料 极狐GitLab 在各种操作系统下的安装指南官网文档 前提条件 一个安装了 Rocky Linux 操作系统的云服务器 可以查看 /etc/os-release 中的信息,确认操作系统信息: NAME"Rocky …...
![](https://i-blog.csdnimg.cn/direct/c01a329f1bcc422bb2e354336239070e.png)
数据库(MySQL)练习
数据库(MySQL)练习 一、练习1.15练习1.16练习 二、注意事项2.1 第四天 一、练习 1.15练习 win11安装配置MySQL超详细教程: https://baijiahao.baidu.com/s?id1786910666566008458&wfrspider&forpc 准备工作: mysql -uroot -p #以…...
![](https://i-blog.csdnimg.cn/direct/3e78785fafe846bcb1828f921d81bf1d.png)
Mac上安装Label Studio
在Mac上安装Anaconda并随后安装Label Studio,可以按照以下步骤进行: 1. 在Mac上安装Anaconda 首先,你需要从Anaconda的官方网站下载适用于Mac的安装程序。访问Anaconda官网,点击“Download Anaconda”按钮,选择适合M…...
![](/images/no-images.jpg)
开县集团网站建设/bt兔子磁力搜索
给一个长度为n的数组,数组内有一个数字出现的次数超过了数组长度的一半,请找出这个数字 eg:[1,2,3,2,2,2,5,4,2] 2在数组中出现了5次,超过数组长度一半,输出2 eg:[1],输出1 public int MoreThanHalfNum_Solution(int [] array) {…...
![](/images/no-images.jpg)
郑州网站建设多少钱/自动app优化
当前AI绘画的创造能力已经达到了令人惊叹的水平。通过深度学习和神经网络技术,AI绘画已经可以创造出高度逼真的图像和艺术作品,甚至可以模仿著名艺术家的风格和技巧。 目前,AI生成的艺术品正悄悄开始重塑文化。过去几年里,机器学…...
![](/images/no-images.jpg)
网站制作公司成都/南昌seo招聘信息
在中国古典兵学理论中,有所谓“三才论”。此三才系指“帅才”、“相才”与“将才”。孙子兵法、诸葛兵法之中,对三才之使用皆有妙论。现在,让我们以现代科学观点来对“三才”做出科学分析。愚以为所谓“三才”,从功能角度来审视无…...
![](https://img-blog.csdnimg.cn/d17a10ddb0764e3a98b83f1cb35ad6fb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZWK5YWt5YWt5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
建个注册页面网站/网站开发北京公司
01-本章内容介绍-day04 02-图片存储方案(介绍) 03-图片存储方案-七牛云存储(注册、登录、实名认证) 04-图片存储方案-七牛云存储(新建、查看存储空间) 05-图片存储方案-七牛云存储(鉴权&…...
![](/images/no-images.jpg)
网站打开是别人的/西地那非
//持续更新中 持续学习中 A.奇数除法器 测试时间限制2秒 测试存储器限制256兆字节 输入标准输入 输出标准输出 你有一个整数n。请检查是否n有一个奇数除以一个不同的单位)(( 例如,如果n6,则存在x3。如果n4,…...
![](https://img2018.cnblogs.com/blog/1725357/201909/1725357-20190914165351686-672464216.png)
wordpress博客如何安装/南京seo整站优化技术
一:web框架基础简介 【1】web框架本质 (1)web本质也是C/S架构 (2)浏览器:客户端 (2)服务端:服务端 【2】web框架自定义 import socket server socket.socket() server.…...