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

【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的代码运用

相关文章:

【Linux网络编程】序列化与反序列化

目录 一&#xff0c;序列化和反序列化的说明 二&#xff0c;Jsoncpp库的介绍 三&#xff0c;Jsoncpp库的使用 3-1&#xff0c;Json::Value类 3-2&#xff0c;Json::StreamWriter类 3-3&#xff0c;Json::CharReader类 一&#xff0c;序列化和反序列化的说明 序列化与反…...

Spring Boot中的自动配置原理是什么

Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置&#xff0c;通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置&#xff0c;Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…...

大模型相关资料、基础技术和排行榜

大模型排行榜 测试集CEval中文多个学科测试集排名MMLU大规模多任务语言理解英文排名&#xff0c;介绍斯坦福排行榜Math-VMath-VistaOpen LLMs LeaderboardCMMLU 大模型数据集 标题简介19个大模型常用的评估数据集和训练数据集汇总19个大模型常用的评估数据集和训练数据集汇总最…...

如何安装cnpm

今天尝试用npm install安装一个项目的依赖&#xff0c;但是无论如何都不能完成&#xff0c;等待时间非常久&#xff0c;所以同事推荐了cnpm&#xff0c;确实非常好用&#xff0c;所以推荐了出来&#xff0c;希望能给大家带来帮助。 cnpm 是中国淘宝团队提供的一个 npm 镜像工具…...

正则表达式 匹配特定字符后的所有字符

在处理文本数据时&#xff0c;正则表达式&#xff08;RegularExpressions&#xff0c;简称Regex&#xff09;是一种非常强大的工具&#xff0c;它可以用来搜索、匹配和替换文本中符合特定模式的字符串。 首先&#xff0c;明确我们的目标是匹配完整的URL&#xff0c;并获取它之…...

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…...

数据结构与算法:动态规划dp:理论基础和相关力扣题(509.斐波那契数列、70.爬楼梯)

1.0.理论基础 动态规划主要解决的问题种类有&#xff1a; 背包问题打家劫舍股票问题子序列问题 解决步骤&#xff1a; dp数组及其下标的意义递推公式dp数组初始化遍历顺序打印dp数组 2.0.相关力扣题 509.斐波那契数列 class Solution:def fib(self, n: int) -> int:i…...

某政务行业基于 SeaTunnel 探索数据集成平台的架构实践

分享嘉宾&#xff1a;某政务公司大数据技术经理 孟小鹏 编辑整理&#xff1a;白鲸开源 曾辉 导读&#xff1a;本篇文章将从数据集成的基础概念入手&#xff0c;解析数据割裂给企业带来的挑战&#xff0c;阐述数据集成的重要性&#xff0c;并对常见的集成场景与工具进行阐述&…...

word-break控制的几种容器换行行为详解

word-break 属性在控制换行行为时需要根据语言判断&#xff0c;对于中文 一个字符就是一个单词&#xff0c;字符换行不影响阅读理解&#xff0c;而对于英文来说&#xff0c;多个连续的字符才会是一个单词&#xff0c;例如中文的 早 英文为 morning。 morning7个字符才算一个单词…...

【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. 控制器接收和…...

关于2025年智能化招聘管理系统平台发展趋势

2025年&#xff0c;招聘管理领域正站在变革的十字路口&#xff0c;全新的技术浪潮与不断变化的职场生态相互碰撞&#xff0c;促使招聘管理系统成为重塑企业人才战略的关键力量。智能化招聘管理系统平台在这一背景下迅速崛起&#xff0c;其发展趋势不仅影响企业的招聘效率与质量…...

Docker部署Spring Boot + Vue项目

目录 前提条件 概述 下载代码 打开代码 Docker创建网络 MySQL容器准备 MySQL数据库配置 启动MySQL容器 测试连接MySQL 初始化MySQL数据 Redis容器准备 修改Redis配置 启动redis容器 部署后端 后端代码打包 上传jar包到Linux 创建Dockerfile 构建镜像 运行后…...

开发规范

开发规范 企业项目开发有2种开发模式&#xff1a;前后台混合开发和前后台分离开发。 前后台混合开发 顾名思义就是前台后台代码混在一起开发&#xff0c;如下图所示&#xff1a; 这种开发模式有如下缺点&#xff1a; 沟通成本高&#xff1a;后台人员发现前端有问题&#xf…...

九 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 …...

openplant实时数据库(二次开发)

资源地址 我的网盘〉软件>数据库>openplant>openplant实时数据库(二次开发)...

C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析&#xff1a; 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数&#xff0c;使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…...

“AI智慧化服务系统:未来生活的智能管家

在当今快速发展的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活。AI智慧化服务系统作为这一变革的前沿技术&#xff0c;正在逐渐成为我们未来生活的智能管家。它们不仅提高了服务效率&#xff0c;还为我们带来了更加个性化和便捷…...

python管理工具:conda部署+使用

python管理工具&#xff1a;conda部署使用 一、安装部署 1、 下载 - 官网下载&#xff1a; https://repo.anaconda.com/archive/index.html - wget方式&#xff1a; wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…...

minio https配置

minio启动时候指定数据目录,配置文件&#xff0c;密钥文件目录&#xff0c;环境文件 1.创建minio用户,专门用于服务启动的 groupadd -r minio-user useradd -M -r -g minio-user minio-user 2.在当前用户目录下创建minio目录&#xff0c;存储minio相关文件 mkdir minio 在mini…...

SpringMVC——原理简介

狂神SSM笔记 DispatcherServlet——SpringMVC 的核心 SpringMVC 围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器&#xff08;即不同的Servlet&#xff09;。根据请求的url&#xff0c;分配到对应的Servlet接口。 当发起请求时被前置的控制…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...