【网络】序列化反序列化

news2024/11/27 22:40:05

序列化反序列化

  • 一、序列化反序列化
    • 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 --> string
    void Serialize(std::string* outstr)
    {
        Json::Value root;   //万能对象,接收任意类型。
        // 构建数据的映射关系
        root["x"] = _x;
        root["y"] = _y;
        root["op"] = _op;
        
        // 序列化
        Json::FastWriter writer;
        *outstr = writer.write(root);
    }

    // 反序列化 : string -->struct
    bool 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 --> string
    void Serialize(std::string* outstr)
    {

        Json::Value root;
        // 构建数据的映射关系
        root["result"] = _result;
        root["code"] = _code;
        
        // 序列化
        Json::FastWriter writer;
        *outstr = writer.write(root);
    }

    // 反序列化 :string -->struct
    bool 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.coloradmin.cn/o/1146299.html

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

相关文章

JavaScript从入门到精通系列第二十五篇:JavaScript中的Date对象

文章目录 一&#xff1a;Date对象简介 1&#xff1a;概念简介 二&#xff1a;Date对象 1&#xff1a;创建当前时间 2&#xff1a;创建指定时间 三&#xff1a;日期对象函数 1&#xff1a;getDate() 2&#xff1a;getDay() 3&#xff1a;getMonth() 4&#xff1a;getF…

基于springboot环保话题管理系统-计算机毕设 附源码 28550

springboot环保话题管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小型企业当然也不能排除在外。环保话题管理系统是以实际运用为开发背景&#xff0c;运用软…

Flask路由机制分析之二

一、前言 上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念&#xff0c;这节我们具体分析一下路由内部机制&#xff0c;Flask路由依赖于werkzegu的routing模块来实现。 二、werkzegu的routing模块介绍 Werkzegu库的routing模块主要功能在于URL…

iMazing2024年最新许可证-iMazing许可证激活补丁

《iMazing》2024年最新许可证&#xff0c;iMazing 号称是 Mac 和PC上最好的iOS设备管理器。iMazingapp还可以帮助用户轻松地管理应用程序&#xff0c;可以方便的进行拷贝&#xff0c;安装&#xff0c;删除和更新应用程序。它可以帮助用户轻松访问文件系统&#xff0c;并可以轻松…

使用FastAPI部署Ultralytics YOLOv5模型

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

深入探究Python中的深度学习:神经网络与卷积神经网络

当下&#xff0c;深度学习已经成为人工智能研究和应用领域的关键技术之一。作为一个开源的高级编程语言&#xff0c;Python提供了丰富的工具和库&#xff0c;为深度学习的研究和开发提供了便利。本文将深入探究Python中的深度学习&#xff0c;重点聚焦于神经网络与卷积神经网络…

基于springboot实现校园台球厅人员与设备系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园台球厅人员与设备系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园台球厅人员与设备管理系统的网络应用&#xff0c;在外国管理系统已经是很普遍的方式&#xff0c;不过国内的管理网…

CN考研真题知识点二轮归纳(1)

本轮开始更新真题中涉及过的知识点&#xff0c;总共不到20年的真题&#xff0c;大致会出5-10期&#xff0c;尽可能详细的讲解并罗列不重复的知识点~ 目录 1.三类IP地址网络号的取值范围 2.Socket的内容 3.邮件系统中向服务器获取邮件所用到的协议 4.RIP 5.DNS 6.CSMA/CD…

C++标准模板(STL)- 类型支持 (类型特性,is_member_object_pointer,is_member_function_pointer)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

IOC课程整理-11 Spring 资源管理

1. 引入动机 2. Java 标准资源管理 3. Spring 资源接口 4. Spring 内建 Resource 实现 5. Spring Resource 接口扩展 6. Spring 资源加载器 7. Spring 通配路径资源加载器 8. Spring 通配路径资源扩展 9. 依赖注入Spring Resource 10. 依赖注入 ResourceLoader 11. 面试题精选 …

前端技术知识(含八股)总结 - 持续更新中

前端技术知识&#xff08;含八股&#xff09;总结 - 持续更新中 参考文献1.HTML和CSS1.1 语义化标签1.2 CSS 选择器及优先级 / position 定位 / box-sizing 属性 / transition / 继承属性&#xff08;如字体文字类的属性大部分有继承&#xff09;/ 行内元素和块级元素 / html的…

中科软:聚焦垂直行业,更聚焦“模型即服务”

【科技明说 &#xff5c; 重磅专题】 中科软的特长是什么&#xff0c;熟悉的业内朋友不难回答。但是&#xff0c;在AIGC时代&#xff0c;中科软的特长又是什么&#xff1f; 发挥自身优势与特长&#xff0c;与业界友商在AIGC发展之路上热情PK&#xff0c;这对于中科软的务实传…

【面试题08.06.汉诺塔问题】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {int nA.size();_hanota(n,A,B,C);}void _hanota(int n,vector&l…

闭包通俗解释,Demo(Go Java Python)

闭包的概念 想象一下&#xff0c;你有一个包裹着变量的函数&#xff0c;就像是一个封闭的包裹。这个包裹里有一个变量&#xff0c;而这个函数&#xff08;或包裹&#xff09;本身就是一个完整的单元。当你把这个函数传递给其他地方&#xff0c;就像是把这个包裹传递出去。 这…

【教3妹学编辑-算法题】H 指数

2哥 :3妹&#xff0c;早上好啊&#xff0c; 吃过早餐了没呢&#xff1f; 3妹&#xff1a;2哥早&#xff0c; 我早餐已经吃过了&#xff0c; 吃了油条、豆浆、牛肉饼、八宝粥…… 嗝…… 2哥&#xff1a;吃这么多&#xff0c; 看你都打嗝了&#xff0c;吃饭喝足&#xff0c;开始…

分享54个ASP.NET源码总有一个是你想要的

分享54个ASP.NET源码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1khPzxtOFP0wUHpg7TBDitg?pwd8888 提取码&#xff1a;8888 项目名称 (ASP.Net)基于三层架构的企业信息管理系统 asp .net mvc编写的房产管理系统 asp.net core mvc 病人管理后台 asp.ne…

2023年【汽车驾驶员(中级)】最新解析及汽车驾驶员(中级)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;中级&#xff09;最新解析考前必练&#xff01;安全生产模拟考试一点通每个月更新汽车驾驶员&#xff08;中级&#xff09;复审考试题目及答案&#xff01;多做几遍&#xff0c;其实通过汽车驾…

升级降级苹果手机iOS系统工具iMazing2024

像任何计算设备一样&#xff0c;iPhones和iPads偶尔也会出现问题。有时iOS会崩溃&#xff0c;你需要重新安装它&#xff0c;以确保你可以继续使用设备&#xff0c;而不会丢失任何数据。有时你会看到一个黑屏&#xff0c;你不能用你的设备做任何事情。有时iPhone或iPad会陷入循环…

安信可小安派AiPi 代码下载

安信可小安派AiPi 代码下载笔记记录 AiPi 代码下载&#xff08;直接使用命令行操作&#xff0c;仅需要Type-C接口线即可&#xff09; 在完成环境搭建&#xff0c;和代码编写前提下&#xff0c;使用Type-C接口线下载代码&#xff0c;当然可以自己使用usb-ttl串口线下载程序&am…

TextureView和SurfaceView

1、Surface Surface对应了一块屏幕的缓冲区&#xff0c;每一个window对应一个Surface&#xff0c;任何View都是画在Surface上的&#xff0c;传统的View共享一块屏幕缓冲区&#xff0c;所有的绘制都必须在UI线程上进行。 2、SurfaceView 顾名思义就是Surface的View&#xff0c;…