【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构

目录

  • 0 引言
  • 1 HTTP基本知识
    • 1.1 请求类型
    • 1.2 HTTP请求报文格式
    • 1.3 HTTP响应报文格式
    • 1.4 拓展:GET vs POST 请求方法
      • GET请求
        • 请求报文:
        • 响应报文
      • POST请求
        • 请求报文
        • 响应报文
      • 其他注意事项
      • 示例:
        • GET请求示例
        • POST请求示例
  • 2 实战
    • 2.1 QtNetwork模块介绍
    • 2.2 编程实现HTTP客户端
    • 2.3 编程实现HTTP服务器

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:C++专栏
  • 💥 标题:【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构
  • ❣️ 寄语:书到用时方恨少,事非经过不知难。
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正!

0 引言

  • 最近项目涉及到网络HTTP相关内容,需要处理客户端发送的POST、GET等请求。所以本文使用QT的QtNetwork模块来实现一个简单的发送POST、GET请求的客户端,然后响应POST、GET请求的服务器。
  • 本文涉及到一些HTTP的基本知识,可以参考博主之前的文章:计算机网络HTTP协议

1 HTTP基本知识

1.1 请求类型

HTTP(Hypertext Transfer Protocol)协议 定义了多种请求方法,也称为HTTP请求类型或HTTP动词。这些请求方法表示客户端希望对特定资源执行的操作。以下是常见的HTTP请求类型、其功能和应用场景:

  1. GET:

    • 功能: 用于从服务器获取指定资源的信息。请求的参数通常附在URL后面,通过查询字符串传递。
    • 应用场景: 用于查看网页、下载文件、获取数据等。是幂等的,不应该对服务器产生影响。(我们输入一个网址,其实就是从服务器获得一个HTML文件,然后浏览器内核再根据其将内容绘制出来)
  2. POST:

    • 功能: 用于向服务器提交数据,通常用于表单提交。请求的参数通常包含在请求体中。
    • 应用场景: 用于创建新资源、提交表单数据、上传文件等。可能对服务器产生影响。不是幂等的,多次相同的POST请求可能产生不同的结果。
  3. PUT:

    • 功能: 用于向服务器上传新资源,或者更新已存在的资源。请求的参数通常包含在请求体中。
    • 应用场景: 用于创建或更新资源。是幂等的,多次相同的PUT请求应该产生相同的结果。
  4. DELETE:

    • 功能: 用于请求服务器删除指定的资源
    • 应用场景: 用于删除指定资源。是幂等的,多次相同的DELETE请求应该产生相同的结果。
  5. PATCH:

    • 功能: 用于对资源进行部分更新。请求的参数通常包含在请求体中,表示对资源的局部修改。
    • 应用场景: 用于对资源进行局部更新,而不是替换整个资源。
  6. HEAD:

    • 功能: 类似于GET请求,但服务器只返回响应头,不返回实体主体。常用于检查资源的元信息,如是否存在、是否已经修改等。
    • 应用场景: 用于获取资源的头部信息,而不需要获取整个资源的内容。
  7. OPTIONS:

    • 功能: 用于获取目标资源支持的通信选项。客户端可以通过这个方法了解服务器支持的方法。
    • 应用场景: 用于确定服务器支持的方法,以及支持的头信息等。
  8. TRACE:

    • 功能: 用于在目标服务器上执行一个消息环回测试,客户端发送的请求会在最终的服务器上返回,用于诊断和调试。
    • 应用场景: 主要用于网络诊断,通常不会在实际应用中直接使用。

选择适当的HTTP请求类型取决于具体的操作和业务需求。每种请求类型都有其独特的功能和应用场景,使其适用于不同的情境。

1.2 HTTP请求报文格式

HTTP请求报文是客户端发送给服务器的文本信息,包含请求的各种参数和头信息。它的基本格式如下:

<Method> <Request-URI> <HTTP-Version>
<Headers><Optional Request Body>

其中,各部分的含义如下:

  • <Method>:HTTP请求方法,例如GET、POST、PUT等。
  • <Request-URI>:请求的资源标识符,通常是一个URL。
  • <HTTP-Version>:使用的HTTP协议版本,例如HTTP/1.1。
  • <Headers>:包含多行的头部信息,每行都包含一个头字段和对应的值。
  • <Optional Request Body>:可选的请求体,用于包含请求时需要发送的数据,例如POST请求中的表单数据。

以下是一个具体的例子:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Upgrade-Insecure-Requests: 1

在这个例子中:

  • 请求方法是GET。
  • 请求的资源标识符是/index.html
  • 使用的HTTP协议版本是HTTP/1.1。
  • 请求头部包含了HostUser-AgentAccept等字段,每个字段都以<header-name>: <header-value>的形式呈现。
  • 由于GET请求通常不包含请求体,因此没有<Optional Request Body>部分。

对于包含请求体的请求,例如POST请求,请求体会紧随请求头部,并用一个空行分隔。例如:

POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 23username=johndoe&password=123

在这个例子中,请求体包含了表单数据username=johndoe&password=123,并通过Content-Type头字段指定了数据的格式。

1.3 HTTP响应报文格式

HTTP响应报文是服务器返回给客户端的文本信息,包含了服务器对客户端请求的响应。其基本格式如下:

<HTTP-Version> <Status-Code> <Reason-Phrase>
<Headers><Optional Response Body>

其中,各部分的含义如下:

  • <HTTP-Version>:使用的HTTP协议版本,例如HTTP/1.1。
  • <Status-Code>:一个三位数的状态码,表示服务器对请求的处理结果。
  • <Reason-Phrase>:状态码的文本描述,描述了状态码的原因。
  • <Headers>:包含多行的头部信息,每行都包含一个头字段和对应的值。
  • <Optional Response Body>:可选的响应体,用于包含服务器返回给客户端的数据。

以下是一个具体的例子:

HTTP/1.1 200 OK
Date: Mon, 15 Nov 2023 12:00:00 GMT
Server: Apache
Content-Type: text/html
Content-Length: 1234
Connection: keep-alive<html><head><title>Hello, World!</title></head><body><h1>Welcome to my website!</h1></body>
</html>

在这个例子中:

  • 使用的HTTP协议版本是HTTP/1.1。
  • 状态码是200,表示请求成功。
  • 原因短语是"OK",为状态码的文本描述。
  • 响应头部包含了DateServerContent-Type等字段。
  • 由于这是一个简单的HTML响应,响应体包含了一个HTML文档。

对于包含响应体的响应,例如HTML页面、JSON数据等,响应体会紧随响应头部,并用一个空行分隔。响应体的格式和内容取决于服务器的实际响应。

1.4 拓展:GET vs POST 请求方法

GET和POST请求在HTTP中的请求报文和响应报文中有一些区别,这主要涉及到数据的传递方式和一些特定的语义约定。


GET请求

请求报文:
  1. 参数传递: GET请求的参数通常附在URL的查询字符串中,通过?&符号进行连接,例如:http://example.com/resource?param1=value1&param2=value2
  2. 请求体: GET请求通常没有请求体,因为它用于请求资源,而不是向服务器提交数据。
响应报文
  1. 响应体: GET请求的响应体包含了服务器返回的资源数据。

POST请求

请求报文
  1. 参数传递: POST请求的参数通常包含在请求体中,而不是在URL中,特别是用于提交表单数据或上传文件等场景。
  2. 请求体: POST请求的请求体包含了客户端提交给服务器的数据。

响应报文
  1. 响应体: POST请求的响应体包含了服务器对提交的数据的处理结果。

其他注意事项

  1. 安全性: POST请求的数据包含在请求体中,相对于GET请求,POST请求具有更好的安全性,因为它不会在URL中明文传递敏感信息。
  2. 幂等性: GET请求是幂等的,多次相同的GET请求应该产生相同的结果。POST请求是非幂等的,多次相同的POST请求可能会产生不同的结果。

示例:

GET请求示例

请求报文:

GET /resource?param1=value1&param2=value2 HTTP/1.1
Host: example.com

响应报文:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234<!DOCTYPE html>
<html><head><title>GET Response</title></head><body><h1>This is the response to a GET request.</h1></body>
</html>

POST请求示例

请求报文:

POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27param1=value1&param2=value2

响应报文:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45{"status": "success", "message": "POST response"}

总的来说,GET和POST请求的区别主要在于参数传递的方式、请求体的内容和请求的语义。GET适用于获取资源,而POST适用于向服务器提交数据。

2 实战

2.1 QtNetwork模块介绍

QtNetwork模块是Qt中用于网络编程的模块,提供了一系列用于处理网络通信的类和工具。以下是QtNetwork模块的一些主要功能:

  1. TCP和UDP通信: 提供QTcpSocketQUdpSocket等类,用于实现TCP和UDP协议的通信。这些类使得在Qt应用程序中创建和管理网络连接变得相对简单。

  2. HTTP客户端和服务器: 提供QNetworkAccessManager类,用于实现HTTP协议的客户端功能。它支持GET、POST等HTTP请求方法,并允许异步地发送和接收HTTP请求。

  3. 网络请求和响应处理: 提供QNetworkRequestQNetworkReply等类,用于构建和处理网络请求。这些类提供了丰富的功能,包括请求头的设置、数据的传输和响应的处理等。

  4. FTP客户端: 提供QFtp类,用于实现FTP协议的客户端功能。它允许在Qt应用程序中进行文件传输操作。

  5. 网络代理: 支持网络代理设置,可以通过QNetworkProxy类配置网络代理,以便在需要时通过代理服务器进行网络通信。

  6. 网络协议支持: QtNetwork模块支持各种网络协议,包括IPv4和IPv6,SSL/TLS等。这使得Qt应用程序能够适应多种网络环境和安全需求。

  7. 网络状态监控: 提供QNetworkConfigurationQNetworkConfigurationManager类,用于监控和管理网络配置,以便在应用程序中适应不同的网络状态。

  8. 网络缓存: 提供QNetworkDiskCache等类,用于实现网络缓存,以提高应用程序的性能并减少对网络资源的依赖。

这些功能使QtNetwork成为一个强大的网络编程工具,适用于开发涉及网络通信的各种应用,从简单的客户端到复杂的服务器应用。

2.2 编程实现HTTP客户端

根据上述描述,可以知道,使用 QTcpSocketQUdpSocketQNetworkAccessManagerQNetworkRequestQNetworkReply等类可以实现简单的HTTP客户端。

接下来是代码:

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QUrlQuery>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建网络访问管理器QNetworkAccessManager manager;// 创建HTTP请求QNetworkRequest getRequest(QUrl("http://example.com"));// 发送GET请求QNetworkReply *getReply = manager.get(getRequest);// 处理GET请求完成的信号QObject::connect(getReply, &QNetworkReply::finished, [&]() {if (getReply->error() == QNetworkReply::NoError) {qDebug() << "GET Response:" << getReply->readAll();} else {qDebug() << "GET Error:" << getReply->errorString();}getReply->deleteLater();});// 进入应用程序事件循环return a.exec();
}

在使用 Qt 进行网络请求时,尤其是在进行异步的网络操作时,需要进入应用程序的事件循环。这是因为 Qt 的事件循环负责处理事件,而网络请求的完成(比如接收到服务器的响应)通常是通过 Qt 的信号-槽机制来处理的。

让我们来详细解释一下:

  1. 异步操作: Qt 的网络操作通常是异步的,即在发起网络请求后,程序会继续执行后续的代码而不等待请求完成。这是为了确保应用程序的界面和其他部分能够保持响应性,不被阻塞。

  2. 信号-槽机制: 当网络请求完成时,QNetworkReply 会发出 finished 信号。你在代码中使用 QObject::connect 来连接这个信号到一个槽函数,以便在请求完成时执行一些操作。

  3. 事件循环: 为了让信号-槽机制正常工作,需要进入应用程序的事件循环。调用 QCoreApplication::exec() 或者 QEventLoop::exec() 启动事件循环,使得 Qt 可以不断地检查并处理事件队列。

在代码中,调用 return a.exec(); 启动了事件循环。这样,当 GET 请求完成并发出 finished 信号时,相关的槽函数将会被执行。如果没有进入事件循环,这个槽函数将不会被触发,因为事件循环负责调度信号的处理。

简而言之,进入应用程序的事件循环是确保异步操作和信号-槽机制正常工作的关键步骤。如果你的应用程序没有事件循环,它将无法及时响应和处理异步操作的完成事件。

2.3 编程实现HTTP服务器

#ifndef MYHTTPSERVER_H
#define MYHTTPSERVER_H#include <QTcpServer>
#include <QTcpSocket>
#include <QUrlQuery>
#include <QDebug>class MyHTTPServer : public QTcpServer
{Q_OBJECTpublic:MyHTTPServer(QObject *parent = nullptr) : QTcpServer(parent) {}protected://--------------------------------------// 说明:这是 QTcpServer 类的虚函数,当有新的连接到达时,会被调用。// 日期:2023-11-15// 作者:何浩文//--------------------------------------void incomingConnection(qintptr socketDescriptor) override{QTcpSocket *socket = new QTcpSocket(this);socket->setSocketDescriptor(socketDescriptor);// 读取客户端请求connect(socket, &QTcpSocket::readyRead, [&]() {QByteArray requestData = socket->readAll();processRequest(requestData, socket);// 关闭连接socket->disconnectFromHost();});// 处理连接断开connect(socket, &QTcpSocket::disconnected, [&]() {socket->deleteLater();});}private://--------------------------------------// 说明:这个函数用于解析 HTTP 请求,分析请求的方法和路径,并调用相应的处理函数。// 日期:2023-11-15// 作者:海码007//--------------------------------------void processRequest(const QByteArray &requestData, QTcpSocket *socket){// 解析请求QString requestString = QString::fromUtf8(requestData);QStringList requestLines = requestString.split("\r\n");// 解析第一行,获取请求方法和路径QString firstLine = requestLines.first();QStringList parts = firstLine.split(" ");QString method = parts.value(0);QString path = parts.value(1);// 处理 GET 请求if (method == "GET"){handleGetRequest(path, socket);}// 处理 POST 请求else if (method == "POST"){handlePostRequest(path, requestData, socket);}}//--------------------------------------// 说明:处理 HTTP GET 请求的具体逻辑。// 日期:2023-11-15// 作者:海码007//--------------------------------------void handleGetRequest(const QString &path, QTcpSocket *socket){QTextStream responseStream(socket);responseStream.setAutoDetectUnicode(true);// 构造HTTP响应responseStream << "HTTP/1.1 200 OK\r\n"<< "Content-Type: text/html\r\n"<< "Connection: close\r\n"<< "\r\n"<< "<html><body><h1>Hello, World! (GET)</h1></body></html>";// 刷新并等待数据发送完毕socket->flush();socket->waitForBytesWritten();}//--------------------------------------// 说明:处理 HTTP POST 请求的具体逻辑。// 日期:2023-11-15// 作者:海码007//--------------------------------------void handlePostRequest(const QString &path, const QByteArray &requestData, QTcpSocket *socket){// 解析 POST 数据QUrlQuery postData(requestData);QString value = postData.queryItemValue("key");QTextStream responseStream(socket);responseStream.setAutoDetectUnicode(true);// 构造HTTP响应responseStream << "HTTP/1.1 200 OK\r\n"<< "Content-Type: text/html\r\n"<< "Connection: close\r\n"<< "\r\n"<< "<html><body><h1>Hello, " << value << "! (POST)</h1></body></html>";// 刷新并等待数据发送完毕socket->flush();socket->waitForBytesWritten();}
};#endif // MYHTTPSERVER_H

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

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

相关文章

Kafka 的应用场景

Kafka 是一个开源的分布式流式平台&#xff0c;它可以处理大量的实时数据&#xff0c;并提供高吞吐量&#xff0c;低延迟&#xff0c;高可靠性和高可扩展性。 Kafka 最初是为分布式系统中海量日志处理而设计的。它可以通过持久化功能将消息保存到磁盘&#xff0c;并让消费者按…

Express基本接口开发-入门学习与后续进阶

前提推荐 任何一个新的知识都是从文档看起&#xff0c;因此express官方文档示例有必要去学习一遍。 推荐看&#xff1a; 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了&#xff0c;然后现在就可以去练习了 注意&#xff1a;更多示例-代…

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

03-CSS基础选择器

3.1 CSS基础认知&#x1f34e; 3.1.1 &#x1f441;️‍&#x1f5e8;️CSS概念 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets)&#xff0c;为网页标签增加样式表现的 语法格式&#xff1a; 选择器{<!-- 属性设置 -->属性名:属性值; <!--每一个…

Spring Cloud Netflix微服务组件-Eureka

CAP理论 分区容忍是能容忍一个或一部分节点挂掉后&#xff0c;整体系统也能正常工作&#xff08;就是别的节点还是活着的&#xff09;&#xff0c;所以分布式系统中P是必须要有的。比如数据库主从架构&#xff0c;主从两个节点之间需要数据同步&#xff0c;主挂了&#xff0c;…

Mysql中的索引与事务和B树的知识补充

索引与事务和B树的知识补充 一.索引1.概念2.作用3.使用场景4.使用 二.事务1.为什么使用事务2.事务的概念3.使用3.1脏读问题3.2不可重复读3.3 幻读问题3.4解决3.5 使用代码 三.B树的知识补充1.B树2.B树 一.索引 1.概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记…

程序员一般从什么平台兼职接私活?国内外主流9大平台汇总!

我想对于有一定工作经验的工程师来说&#xff0c;肯定听说过或者切身经历过公司裁员、公司倒闭、甚至清退年龄稍大的工程师等一系列负面情况。 其实我们作为员工来说&#xff0c;面对这些打击&#xff0c;我们能争取到的权益是比较少的&#xff0c;即使争取到了一些权益或补偿…

【功能栏】基于session的模拟短信注册功能

框架&#xff1a; spring boot mybatis-plus 目录 1.创建user表 ​编辑2. mybatis-plus插件 3.导入相关依赖 4.配置文件 5.前端代码 register.html style.css 6.后端代码 entity层 mapper层 sevice层 业务层接口 业务层实现类 controller层 7.调试 1. 未输…

unity UGUI无限循环滚动居中

最近在做一个ui循环滚动的功能&#xff0c;网上找了半天脚本感觉都和我实际需求不太符合&#xff0c;自己花费一些时间完成了这个功能记录一下。下面开始正题 &#xff0c;我是采用unity自带组件Scroll View来完成&#xff0c;首先设置Scroll View如下图 面板层级结构如下 然…

C语言每日一题(29)合并两个有序链表

力扣网 21合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 思路分析 最基本的一种思路就是&#xff0c;遍历两个链表&#xff0c;将对应结点的值进行比较&#xff0c;题目要求是要升序排…

基于安卓android微信小程序的食谱大全系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对食谱大全进行需求分析&#xff0c;得出食谱大全主要功能。接着对食谱大全进行总体设计和详细设计。总体设…

实现高值医疗耗材智能化管理的RFID医疗柜解决方案

一、行业背景 医疗物资管理面临着一系列问题&#xff0c;如高值耗材种类激增导致准入标准弱化、信息追踪困难、管理责任不明确等&#xff0c;医院内部设备、财务和临床科室相互独立&#xff0c;兼容性不佳&#xff0c;高值耗材储备不足&#xff0c;缺乏合理的预警机制&#xf…

Java 21:最新特性、性能改进和语言发展

文章目录 模式匹配和模式变量新的记录类型生产者接口本地类型推断的扩展新的垃圾收集器动态CDS档案G1垃圾收集器的增强Java语言的持续发展性能改进和JEPJava 21的部署和使用Java 21的生态系统结语 &#x1f389;欢迎来到Java学习路线专栏~Java 21&#xff1a;最新特性、性能改进…

Postman接口Mock Servier服务器

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 应用场景&#xff1a;后端的接口还没有开发完成&#xff0c;前端的业务需要调用后端的接口&#xff0c;可以使用mock模拟。 一…

终于有人把VMware虚拟机三种网络模式讲清楚了!

前段时间VMware更新了&#xff0c;你用上最新版了吗&#xff1f; 有几个网工在操作中遇到过各种各样的问题。 比如说由于公司服务器重启导致出现下面的问题&#xff1a;在Xshell里连接虚拟机映射时连接失败&#xff1b;能够连接上虚拟机的映射地址&#xff0c;但git pull时报…

电子电机行业万界星空科技MES解决方案

现在电子电机行业规模越来越大&#xff0c;也伴随着生产和管理成本走向变高的现象。针对这个问题&#xff0c;mes系统就成为各电子电机制造业的最优选择。 电子机电行业MES涵盖了从原材料采购到最终产品交付的整个过程&#xff0c;包括生产计划、物料管理、生产过程监控、质量…

CleanMyMac X“断网激活”真的可以吗?

CleanMyMac X帮助Mac系统进行垃圾清理&#xff0c;清除多余的缓存、应用程序等&#xff0c;在提高工作效率上起了很大的作用。但是随着对软件的需求不断增加&#xff0c;很多人开始研究通过捷径破解正版软件&#xff0c;但是是否能成功呢&#xff1f;今天小编就为大家揭开“断网…

7-爬虫-中间件和下载中间件(加代理,加请求头,加cookie)、scrapy集成selenium、源码去重规则(布隆过滤器)、分布式爬虫

0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件&#xff08;代理&#xff0c;加请求头&#xff0c;加cookie&#xff09; 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重…

C++ 动态规划 DP教程 (一)思考过程(*/ω\*)

动态规划是一种思维方法&#xff0c;大家首先要做的就是接受这种思维方法&#xff0c;认同他&#xff0c;然后再去运用它解决新问题。 动态规划是用递推的思路去解决问题。 首先确定问题做一件什么事情&#xff1f; 对这件事情分步完成&#xff0c;分成很多步。 如果我们把整件…

【SpringBoot】序列化和反序列化介绍

一、认识序列化和反序列化 Serialization&#xff08;序列化&#xff09;是一种将对象以一连串的字节描述的过程&#xff1b;deserialization&#xff08;反序列化&#xff09;是一种将这些字节重建成一个对象的过程。将程序中的对象&#xff0c;放入文件中保存就是序列化&…