【网络】序列化反序列化

序列化反序列化

  • 一、序列化反序列化
    • 1、概念
    • 2、序列化作用
    • 3、序列化框架的选择
  • 二、Json
    • 1、介绍
    • 2、简单使用

一、序列化反序列化

1、概念

在前文《网络编程套接字》中,我们实现了服务器与客户端之间的字符串通信,这是非常简单的通信,在实际使用的过程中,网络需要传输的不仅仅是字符串,更多的是结构化的数据(类似于class ,struct类似的数据)。

那么我们应该怎么发送这些结构化的数据呢?
如果我们直接发送结构化的数据本身,由于内存对齐的规则(默认对齐数)以及操作系统本身的不同等各种原因,就可能导致通信双方对数据的识别是不一致的,从而出现通信错误。

为了解决这种错误,我们就需要定义一种协议,来让双方能够进行正确通信,为此就有了序列化和反序列化。

  • 序列化(Serialization):具体来说,序列化是将对象转换为字节序列的过程,以便在网络上传输或者保存在本地文件中。
  • 反序列化(Deserialization) :是序列化的逆过程,即把字节序列恢复为对象的过程

例如:
我们可以定义结构体来表示需要交互的信息,发送数据时将这个结构体按照一个规则转换成字符串,接收到数据的时候再按照相同的规则把字符串转化回结构体。这个过程就叫做 “序列化” 和 “反序列化”。

根据某种约定,使一端发送时构造的数据,在另一端能够正确的进行解析。这种约定就是应用层协议。

在这里插入图片描述

2、序列化作用

  • 数据交换:序列化可以将数据转换为跨平台兼容的格式,使得数据可以在不同的系统、编程语言之间进行交换和共享。
  • 持久化存储:将对象序列化后,可以将其保存到磁盘、数据库等介质中,实现数据的持久化存储,防止程序退出或计算机宕机导致数据丢失。
  • 网络通信:在网络通信中,可以将对象序列化后通过网络发送到其他计算机,接收端再进行反序列化,从而实现数据的传输和共享。
  • 缓存优化:序列化后的数据可以被缓存,当需要时直接从缓存中读取,避免了频繁的数据库查询,提高了性能。

总的来说,序列化方便了数据的传输、保存和共享,同时还可以提高程序的性能和响应速度。

3、序列化框架的选择

在选择序列化和反序列化框架的时候,主要从以下两个方面进行考虑:

  • 结果数据大小; 原则上来说,序列化后的数据越小,传输效率越高;

  • 结构复杂程度;结构复杂度会影响序列化和发序列化的效率,结构越复杂,越耗时。

根据以上两点,对于性能要求不是太高的服务器程序,可以选择Json文本格式的序列化框架;对于性能要求比较高的程序程序,则应该选择传输效率更高的二进制序列化框架,建议使用Protobuf

二、Json

1、介绍

Json(JavaScript Object Notation JS对象)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。

Json 协议是一种文本协议,易于阅读和编写,同时也易于机器解析和生成,并能有效地提升网络传输协效率,在JSON中,数据以键值对的方式表示,键是一个字符串,值可以是字符串、数字、布尔值、数组、对象或null。简单的JSON示例如下:

{  "name": "张三",  "age": 25,  "gender": "男"
}

JSON格式具有以下特点:

  • 可读性高:JSON使用简洁明了的文本格式,易于人类阅读和理解。
  • 轻量级:相较于其他数据交换格式如XML,JSON的数据表示更为紧凑,占用更少的存储空间和传输带宽。
  • 平台无关性:JSON格式在不同的编程语言和平台之间具有良好的兼容性,可以方便地进行数据交换和共享。
  • 支持多种数据类型:JSON支持包括字符串、数字、布尔值、数组、对象和null在内的多种数据类型。这使得JSON能够灵活地表示各种数据结构和复杂对象。
  • 易于解析和生成:绝大多数编程语言都提供了JSON的解析和生成库,使得操作JSON数据变得十分方便和高效。
  • 可扩展性:JSON格式支持通过嵌套和组合来表示更复杂的数据结构,可以根据具体需求进行扩展和定制。

2、简单使用

例如在CentOs环境中C++想使用Json需要先安装jsoncpp的第三方库:

sudo yum install -y jsoncpp-devel

jsoncpp的头文件会被安装在系统的 /usr/include/ 路径下。

在这里插入图片描述

动静态库被安装在 /lib64/路径下。

在这里插入图片描述

在实际使用是,我们只需要包含json.h头文件就行了

#include <jsoncpp/json/json.h>

在编译链接时,我们要链接jsoncpp的动态库

-l jsoncpp

Jsoncpp中的部分成员:

  • Value:一种万能对象,能接收任意的kv类型,进行数据映射。
  • FastWriter:是用来进行快速序列化,直接把数据序列化为一行字符串。
  • StyledWriter:进行风格化的序列化,使字符串具有一定的格式更加美观。
  • Reader:用来进行反序列化。

例如我们下面的需求是一个网络版本的计算器,客户端进行发送计算任务,服务端进行计算,我们使用jsoncpp来进行传输数据的序列化和反序列化。

  • 客户端有三个数据: _x(左操作数) _y(右操作数 )_op(操作符)
  • 服务端有两个数据: _result(结果),_code(计算结果的合法性,0表示正确,非零表示各种错误)
// 客户端请求
struct Request
{Request():_x(0), _y(0), _op('+'){}Request(int x, int y, char op):_x(x), _y(y), _op(op){}// 序列化 :struct --> stringvoid Serialize(std::string* outstr){Json::Value root;   //万能对象,接收任意类型。// 构建数据的映射关系root["x"] = _x;root["y"] = _y;root["op"] = _op;// 序列化Json::FastWriter writer;*outstr = writer.write(root);}// 反序列化 : string -->structbool Deserialize(const std::string& instr){Json::Value root;// 反序列化Json::Reader reader;reader.parse(instr, root);// 提取映射的数据_x = root["x"].asInt();_y = root["y"].asInt();_op = root["op"].asInt();return true;}
public:int _x;int _y;char _op;
};// 服务端响应
struct Response
{Response():_result(0), _code(0){}// 序列化 :struct --> stringvoid Serialize(std::string* outstr){Json::Value root;// 构建数据的映射关系root["result"] = _result;root["code"] = _code;// 序列化Json::FastWriter writer;*outstr = writer.write(root);}// 反序列化 :string -->structbool Deserialize(const std::string& instr){// 反序列化Json::Value root;Json::Reader reader;reader.parse(instr, root);// 提取映射的数据_result = root["result"].asInt();_code = root["code"].asInt();return true;}
public:int _result;int _code;
};

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

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

相关文章

Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】

一、创建 VUE 项目 npm create vuelatest二、安装使用 ant-design-vue 安装脚手架工具 $ npm install -g vue/cli # OR $ yarn global add vue/cli使用组件 # 安装 $ npm i --save ant-design-vue4.x全局完整注册 import { createApp } from vue; import Antd from ant-de…

Nokogiri库和OpenURI库使用HTTP做一个爬虫

Nokogiri和OpenURI是两个常用的Ruby库&#xff0c;用于编写爬虫程序。它们的主要功能如下&#xff1a; 1、Nokogiri&#xff1a;Nokogiri是一个强大的HTML和XML解析库&#xff0c;可以用于解析网页内容。它提供了一组简单易用的API&#xff0c;可以方便地遍历和操作HTML或XML文…

IOC课程整理-17 Spring事件

1. Java 事件/监听器编程模型 2. 面向接口的事件/监听器设计模式 3. 面向注解的事件/监听器设计模式 4. Spring 标准事件-ApplicationEvent 5. 基于接口的 Spring 事件监听器 6. 基于注解的 Spring 事件监听器 7. 注册 Spring ApplicationListener 8. Spring 事件发布器 9. Spr…

基于VectorGrid加载GeoServer发布的矢量瓦片实例

目录 前言 一、关于VectorGrid 1、开源地址 2、本地示例 二、与LeafLet集成 1、新建html页面 2、地图初始化 3、pbf瓦片地址配置 4、pbf初始化 三、GeoServer跨域问题 1、web.xml配置 2、重启tomcat 总结 前言 回望10月&#xff0c;发生了一些变动&#xff0c;面向未…

LeetCode--196. 删除重复的电子邮箱

文章目录 1 题目描述2 解题思路2.1 代码实现 1 题目描述 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ----------------------id 是该表的主键列(具有唯一值的列)。 该表的每…

OpenCV官方教程中文版 —— Hough 直线变换

OpenCV官方教程中文版 —— Hough 直线变换 前言一、原理二、OpenCV 中的霍夫变换三、Probabilistic Hough Transform 前言 目标 • 理解霍夫变换的概念 • 学习如何在一张图片中检测直线 • 学习函数&#xff1a;cv2.HoughLines()&#xff0c;cv2.HoughLinesP() 一、原理…

贪心算法总结(未完结)

贪心的定义&#xff08;摘自百度百科&#xff09; 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的…

设计模式(2)-创建型模式

1&#xff0c;创建型模式 4.1 单例设计模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己…

初次学习dubbo记录

---------------------------------------10.17---------------------------------------- 集群和分布式概念 集群&#xff1a;很多"人"做的相同的一件事&#xff0c;即使有一个人挂掉了&#xff0c;也不会对系统造成致命影响 分布式&#xff1a;很多"人"…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理&#xff1a;部门管理&#xff1a;岗位管理&#xff1a;菜单管理&#xff1a;角色管理&#xff1a;字典管理&#xff1a;参数管理&#xff1a; 可以设置是否开启验证码功能通知公告&#xff1a;操作日志&#xff1a;登录日志&#xff1a;在线用户&am…

PAT 乙级1070结绳

题目&#xff1a; 给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子&#xff0c;可以再次对折去跟另一段绳子串连。每次串连后&#xff0c;原来两…

【ChatGPT系列】ChatGPT:创新工具还是失业威胁?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

香港服务器如何做负载均衡?

​  在现代互联网时代&#xff0c;随着网站访问量的不断增加&#xff0c;服务器的负载也越来越重。为了提高网站的性能和可用性&#xff0c;负载均衡成为了一种常见的解决方案。 什么是负载均衡? 负载均衡是一种技术解决方案&#xff0c;用于在多个服务器之间分配负载&#…

【C】想练习C语言?通讯录的实现了解一下

目录 实现思路 开始实现 添加增加联系人功能 添加显示联系人信息的功能 添加删除联系人功能 添加查找指定联系人的功能 添加修改指定联系人的功能 测试 代码 Test.c Contact.c Contact.h 实现思路 1.通讯录中保存人的信息&#xff1a;名字、年龄、性别、电话、住址…

Winform 多语言化快速解析替换工具-1分钟一个界面

随着业务的扩展&#xff0c;有的软件有多语言化的需求。那么如果软件已经很多写死的文字内容如何快速进行语言化替换呢&#xff0c;一个一个去改工作量太大。 于是开发了个小工具用来替换现有内容并生成语音包&#xff0c;原理就是采用正则表达式进行匹配控件关键字以及中文进…

AS/400简介

AS400 AS400 简介AS/400操作系统演示 AS400 简介 在 AS400 中&#xff0c;AS代表“应用系统”。它是多用户、多任务和非常安全的系统&#xff0c;因此用于需要同时存储和处理敏感数据的行业。它最适合中级行业&#xff0c;因此用于制药行业、银行、商场、医院管理、制造业、分销…

使用FastAPI部署Ultralytics YOLOv5模型

YOLO是You Only Look Once(你只看一次)的缩写&#xff0c;它具有识别图像中的物体的非凡能力&#xff0c;在日常应用中会经常被使用。所以在本文中&#xff0c;我们将介绍如何使用FastAPI的集成YOLOv5&#xff0c;这样我们可以将YOLOv5做为API对外提供服务。 Python有几个web框…

CGAL+QT

先安装CGAL和QT 安装完QT其中MSVC 这两个没配置 1、x32配置选择的是 x64配置选择的是 2、CGAL 5.4.5 - Manual: Using CGAL on Windows (with Visual C) 参数文章配置一些环境变量 3、 测试 新建build 进行cmake QT、Boost、CGAL都自动匹配上了&#xff08;环境变量已经配…

FastAPI框架学习笔记(快速入门FastAPI框架)

1. 写在前面 今天整理一篇后端框架的笔记&#xff0c; fastapi框架是比较主流的后端异步web框架&#xff0c;关键是python语言可以写&#xff0c;正好公司最近安排了一些后端服务的活&#xff0c; 所以就看了一个fastapi框架的入门课程(链接在底部)&#xff0c;完成任务&#…

lua-web-utils和proxy设置示例

以下是一个使用lua-web-utils和proxy的下载器程序&#xff1a; -- 首先安装lua-web-utils库 local lwu require "lwu" ​ -- 获取服务器 local function get_proxy()local proxy_url "duoipget_proxy"local resp, code, headers, err lwu.fetch(proxy_…