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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 多层跳板机情况下,ssh可以成功连但是VSCode失败

ssh bbbb -p 22 -J aaaa 成功&#xff0c;但是用 VSCode 如下配置连接失败&#xff1f; Host aaHostName aaUser aaHost bbHostName bbUser bbProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p aa同时&#xff0c;VSCode 连接 aa 成功。那么问题出在哪里&#xff1…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

MySQL SQL优化技巧与原理

前言 随着业务数据量的不断增加&#xff0c;MySQL查询语句的执行效率对程序的运行效率影响逐渐增大。因此&#xff0c;进行SQL优化变得至关重要。本文将结合SQL的执行语句顺序和各种SQL场景&#xff0c;介绍一些常见的MySQL SQL优化技巧及其背后的原理。 一、MySQL SQL执行语…

移动端H5缓存问题

移动端页面缓存问题是指页面的静态资源&#xff08;如图片、JS 和 CSS 文件&#xff09;在浏览器中被缓存后&#xff0c;用户在下次访问时可以直接从本地获取缓存数据&#xff0c;而不需要每次都从服务器重新获取&#xff0c;不过这样可能会导致页面不能正确地更新或者加载最新…

长安“战疫”网络安全公益赛的一些随想

起因 今年刚进入大学&#xff0c;开始带校队&#xff0c;为了培养校队新成员&#xff0c;也就一直计划着和当地的一些高校合作交流&#xff0c;但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作&#xff0c;学校的网安协会也算是沾了光成为了培…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…

CNCF云原生计算基金会

CNCF&#xff0c;全称为云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff09;&#xff0c;成立于2015年&#xff0c;是一个隶属于Linux基金会的非营利组织。CNCF旨在促进和支持开源技术的发展&#xff0c;特别是那些支持云原生&#xff08;cloud native…

【Hive】海量数据存储利器之Hive库原理初探

文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…

go-echo学习笔记

go-echo学习笔记&#xff0c;包含了请求与响应&#xff0c;路由&#xff0c;参数解析&#xff0c;模版渲染&#xff0c;登录验证&#xff0c;日志&#xff0c;文件上传与下载&#xff0c;websocket通信。 文章目录 Part1 Get与PostPart2 四种请求Part3 提取参数Part4 解析json…

mqtt详细介绍及集成到springboot

mqtt详细介绍及集成到springboot 1.mqtt发布/订阅消息参数详细介绍2. mqtt客户端连接参数介绍3. docker-compose搭建mqtt服务端4. springboot集成mqtt实现发布订阅5. 测试注意事项 1.mqtt发布/订阅消息参数详细介绍 1.1. qosQoS0 &#xff0c;Sender 发送的一条消息&#xff0…

【linux命令】ip命令使用

1、设置网口IP 方法1&#xff1a;通过IP设置网口ip 添加静态IP&#xff1a; ip addr add 1.1.1.1/24 dev eth0 删除ip: ip addr del 1.1.1.1/24 dev eth0 方法2&#xff1a;nmtui 配置IP另外方法&#xff1a; nmtui 2、添加路由 添加路由&#xff1a; ip route add 目标网…

基于springboot的租房网站系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

自动化办公|xlwings简介

xlwings 是一个开源的 Python 库&#xff0c;旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作&#xff0c;读取和写入数据&#xff0c;执行宏&#xff0c;甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…

《零基础Go语言算法实战》【题目 4-8】用 Go 语言设计一个遵循最近最少使用(LRU)缓存约束的数据结构

《零基础Go语言算法实战》 【题目 4-8】用 Go 语言设计一个遵循最近最少使用&#xff08;LRU&#xff09;缓存约束的数据结构 实现 LRUCache 类。 ● LRUCache(int capacity) &#xff1a;初始化具有正大小容量的 LRU 缓存。 ● int get(int key) &#xff1a;如果 key 存在…

Sonatype Nexus OSS 构建私有docker 仓库

1.Docker Engine 配置 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"dns": ["8.8.8.8","114.114.114.114"],"experimental": false,"features"…

lqb.key按键全套

#include "stc15.h" #define FOSC 11059200L //#define T1MS (65536-FOSC/1000) //1T模式 #define T1MS (65536-FOSC/12/1000) //12T模式typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;#define LY 1 //…

概率函数,累计分布函数

四. 累计分布函数 1. 累计分布函数&#xff08;CDF, Cumulative Distribution Function&#xff09; 累计分布函数是用来描述随机变量取值小于或等于某个给定值的概率。它适用于离散型和连续型随机变量&#xff0c;并且能够通过概率质量函数&#xff08;PMF&#xff09;或概率…

Docker中编码和时区设置不生效问题排查

一、编码不生效排查 在 docker-compose.yml 中设置了环境变量&#xff0c;但进入 Docker 容器后 LANG 仍然显示为 zh_CN.UTF-8&#xff0c;按照以下步骤进行排查和修复&#xff1a; 1. 确保设置正确 确保你的 docker-compose.yml 文件中环境变量设置没有拼写错误&#xff0c;示…

CSS 样式 margin:0 auto; 详细解读

一、基本语法 margin 属性是用于设置元素的外边距&#xff0c;它可以接受一个、两个、三个或四个值。 margin:0 auto 是一种简洁的写法&#xff0c;其中包含了两个值。 二、值的含义 第一个值 0 表示元素的上下外边距为 0。这意味着该元素的顶部和底部与相邻元素或父元素之间…