网络编程中的序列化、反序列化与协议

网络编程中的序列化、反序列化与协议

  • 1. 序列化和反序列化的概念
  • 2. 序列化、反序列化与协议的关系
  • 3. JSON与网络通信

在网络编程中,序列化和反序列化与协议密切相关,它们共同构成了数据在网络中传输的基础。本文将详细介绍序列化、反序列化以及它们与协议之间的关系,以及它们在网络通信中的应用。

1. 序列化和反序列化的概念

序列化是将对象或数据结构转换为字节流或其他可传输的格式的过程,以便在网络上传输或持久化存储。序列化后的数据可以以一种结构化的形式传输,使得接收方能够准确地解析和还原原始数据。

反序列化则是将序列化后的数据重新转换为原始对象或数据结构的过程,以便接收方能够使用和理解这些数据。

2. 序列化、反序列化与协议的关系

在网络通信中,协议起着制定通信规则和格式的作用,它规定了数据在网络上传输的格式、传输方式以及通信的行为。序列化和反序列化与协议密切相关:

协议规范数据格式:
协议规定了数据在网络上传输的格式和规范,包括数据的结构、编码方式、标识符等。序列化和反序列化需要按照协议规定的格式来进行,以确保数据在传输过程中能够被正确解析和处理。

序列化与网络协议:
序列化将数据转换为可以在网络上传输的格式,而网络协议则负责指定数据在网络中的传输方式和规则。序列化后的数据需要符合网络协议的规范,以便能够在网络中传输和解析。

反序列化与数据解析:
接收方在接收到数据后,需要进行反序列化操作将数据还原为原始格式。这个过程也涉及到协议的解析,接收方需要按照协议规定的格式来解析数据,以确保能够正确地处理和使用数据。

代码示例:

class request
{
public:request(const int &x, const int &y, const char op): x_(x), y_(y), op_(op){}request(){}// 序列化请求对象为格式为 "x + y" 的字符串bool Serialize(string *out){// 将请求对象的参数转换为字符串,并按照指定格式拼接起来*out = to_string(x_);         // 将 x_ 转换为字符串并存储在 out 中*out += blank_spaces;         // 添加空格*out += op_;                  // 添加操作符*out += blank_spaces;         // 添加空格*out += to_string(y_);        // 将 y_ 转换为字符串并追加在 out 后面return true;                  // 序列化成功}// 反序列化字符串为请求对象bool Deserialize(const string &in){int lpos = in.find(blank_spaces); // 查找第一个空格的位置if (lpos == string::npos)return false;                  // 如果找不到空格,解析失败int rpos = in.rfind(blank_spaces); // 查找最后一个空格的位置if (rpos == string::npos)return false; // 如果找不到空格,解析失败x_ = stoi(in.substr(0, lpos)); // 解析第一个空格之前的数字作为xy_ = stoi(in.substr(rpos));    // 解析最后一个空格之后的数字作为yif (lpos + 2 != rpos)return false;   // 如果两个空格之间不是一个字符的间隔,解析失败op_ = in[lpos + 1]; // 解析两个空格之间的字符作为操作符return true;        // 解析成功}public:int x_;   // 请求中的参数xint y_;   // 请求中的参数ychar op_; // 请求中的操作符
};
  1. request(const int &x, const int &y, const char op):构造函数,接受三个参数,分别为整数 x、整数 y 和字符 op,用于初始化请求对象的成员变量。

  2. request():默认构造函数,没有参数,用于创建一个空的请求对象。

  3. bool Serialize(string *out):序列化函数,将请求对象序列化为格式为 “x + y” 的字符串。其中,xy 分别代表请求中的参数,op 代表请求中的操作符。该函数将序列化结果存储在指针
    out 指向的字符串中,并返回 true 表示序列化成功。

  4. bool Deserialize(const string &in):反序列化函数,将字符串反序列化为请求对象。该函数接受一个字符串 in 作为参数,该字符串应该是由 Serialize
    函数生成的格式化字符串。函数会尝试从字符串中解析出参数 xy 和操作符
    op,并将其存储到请求对象的对应成员变量中。如果解析成功,则返回 true,否则返回 false

3. JSON与网络通信

在网络通信中,JSON(JavaScript Object Notation)作为一种通用的数据交换格式,经常被用来进行序列化和反序列化操作。它简单易懂的格式使得数据在网络上传输更加方便,并且能够被多种编程语言支持和解析。

  1. JSON的特点
    轻量级JSON 是一种轻量级的数据交换格式,对于数据量较小的情况下,其格式简洁明了,不会增加太多的网络负担。
    易读性JSON 使用键值对的形式表示数据,结构清晰,易于人类阅读和编写。
    可扩展性:JSON 支持嵌套结构,可以构建复杂的数据格式,并且支持数组等数据类型,使得它在不同场景下都能发挥作用。

  2. JSON与序列化、反序列化
    在网络通信中,序列化和反序列化是将数据转换为网络传输所需的格式和从网络接收的数据转换为程序可识别的格式的过程。JSON 与序列化、反序列化密切相关:

序列化 (Serialization)
Serialize 方法中,我们将 request 对象的成员变量 x_y_op_ 序列化为 JSON 格式的字符串。我们使用了 Json::Value 对象来表示 JSON 数据,然后将 x_y_op_ 分别赋值给 JSON 对象的相应字段。最后,我们使用 Json::StyledWriterJSON 对象转换为格式化后的 JSON 字符串,并将其存储在传入的 out 字符串中。

// 将请求对象序列化为 JSON 格式的字符串
bool request::Serialize(std::string *out) {// 创建一个 Json::Value 对象,用于存储 JSON 数据Json::Value s;// 创建 JSON 对象并填充数据s["x"] = x_;   // 将 x_ 存储为键为 "x" 的字段s["y"] = y_;   // 将 y_ 存储为键为 "y" 的字段s["op"] = op_; // 将 op_ 存储为键为 "op" 的字段// 使用 Json::StyledWriter 将 JSON 对象转换为格式化后的 JSON 字符串Json::StyledWriter w;*out = w.write(s); // 将转换后的 JSON 字符串存储到 out 中return true; // 序列化成功
}

反序列化 (Deserialization)
Deserialize 方法中,我们从传入的 JSON 格式的字符串中解析出 x_y_op_ 的值,并赋值给 request 对象的相应成员变量。我们使用了 Json::Value 对象来解析 JSON 数据,并使用 Json::Reader 对象来解析 JSON 字符串。然后,我们从 Json::Value 对象中提取出 xyop 字段的值,并分别赋值给 request 对象的成员变量。

// 将 JSON 格式的字符串反序列化为请求对象
bool request::Deserialize(const std::string &in) {// 创建一个 Json::Value 对象,用于存储 JSON 数据Json::Value s;// 创建一个 Json::Reader 对象,用于解析 JSON 数据Json::Reader r;// 使用 Json::Reader 解析传入的 JSON 字符串并存储到 Json::Value 对象 s 中r.parse(in, s);// 从 Json::Value 对象中提取字段的值并赋值给请求对象的成员变量x_ = s["x"].asInt();          // 获取键为 "x" 的字段值并转换为整数,赋值给 x_y_ = s["y"].asInt();          // 获取键为 "y" 的字段值并转换为整数,赋值给 y_op_ = s["op"].asString()[0]; // 获取键为 "op" 的字段值的第一个字符,赋值给 op_ (假设 op 是单个字符)return true; // 反序列化成功
}

序列化:将对象或数据结构转换为 JSON 格式的字符串,以便在网络上传输。序列化过程需要将对象的各个属性转换为 JSON 对象的键值对,并将其按照 JSON 的格式进行组织。
反序列化:将接收到的 JSON 格式的字符串转换为程序可识别的对象或数据结构。反序列化过程需要解析 JSON 字符串,提取其中的数据,并将其转换为程序内部可处理的格式。

完整代码:https://gitee.com/yua-lian/learning ( TCP 网络编程 序列化、反序列化)

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

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

相关文章

StarRocks 助力金融营销数字化进化之路

作者:平安银行 数据资产中心数据及 AI 平台团队负责人 廖晓格 平安银行五位一体,做零售金融的领先银行,五位一体是由开放银行、AI 银行、远程银行、线下银行、综合化银行协同构建的数据化、智能化的零售客户经营模式,这套模式以数…

人工智能大模型学习:在自然语言处理、图像识别与语音识别中的应用及未来展望

在当前技术环境下,人工智能(AI)已成为推动各行各业进步的关键力量。AI的大模型学习特别引人注目,它不仅要求研究者具备深厚的数学基础和编程能力,还需要对特定领域的业务场景有深入的了解。这种复合型知识结构使得AI大…

【Hadoop大数据技术】——Hadoop高可用集群(学习笔记)

📖 前言:Hadoop设计之初,在架构设计和应用性能方面存在很多不如人意的地方,如HDFS和YARN集群的主节点只能有一个,如果主节点宕机无法使用,那么将导致HDFS或YARN集群无法使用,针对上述问题&#…

值得参考的golang语言开发规范:Uber Go 语言编码规范,一些优秀的技巧可以提升代码的质量、避免代码缺陷和bug漏洞

值得参考的golang语言开发规范:Uber Go 语言编码规范,一些优秀的技巧可以提升代码的质量、避免代码缺陷和bug漏洞。 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,…

Java图的遍历知识点(含面试大厂题和源码)

图的遍历是图论中的一个基本概念,主要指的是按照某种规则,系统地访问图中的每一个顶点,且每个顶点仅被访问一次。图遍历的主要目的是为了搜索图中的信息或检查图中是否存在特定的路径或圈。图的遍历算法主要有两种:深度优先搜索&a…

Linux简单基础配置

以下配置一般需要切换为root用户下进行。 1、修改主机名 node1主机终端执行: hostnamectl set-hostname node1 node2主机终端执行: hostnamectl set-hostname node2 node3主机终端执行: hostnamectl set-hostname node3 2、配置固定IP vim /etc/sysconfig/network-scripts…

UE5 LiveLink 自动连接数据源,以及打包后不能收到udp消息的解决办法

为什么要自动连接数据源,因为方便打包后接收数据,这里我是写在了Game Instance,也可以写在其他地方,自行替换成Beginplay和Endplay 关于编辑器模式下能收到udp消息,打包后不能收到消息的问题有两点需要排查,启动打包后…

Jmeter脚本优化——CSV数据驱动文件

使用 CSV 数据文件设置实现参数化注册 1) 本地创建 csv 文件,并准备要使用的数据,这里要参数化的是注册的用户名和邮箱。所以在 csv 文件中输入多组用户名和邮箱。 2) 通过测试计划或者线程组的右键添加->配置元件->CSV…

亚信安慧AntDB解析:数据库技术的新里程碑

AntDB简化了开发运维,更提高了数据库的易用性。AntDB是一种创新的数据库管理系统,其设计理念旨在让用户能够更便捷地进行数据库操作,减少繁琐的配置和管理工作,提升工作效率。 通过AntDB,用户可以快速部署和管理数据库…

AI大模型的看法

现在的AI大模型行情可谓如火如荼,吸引了众多科技巨头和投资者的目光。随着大数据和计算力的不断提升,AI大模型在语音识别、自然语言处理、图像识别等领域取得了显著进展,为各行各业带来了前所未有的机遇。 在技术栈方面,AI大模型主…

Py之scikit-learn-extra:scikit-learn-extra的简介、安装、案例应用之详细攻略

Py之scikit-learn-extra:scikit-learn-extra的简介、安装、案例应用之详细攻略 目录 scikit-learn-extra的简介 scikit-learn-extra的安装 scikit-learn-extra的案例应用 1、使用 scikit-learn-extra 中的 IsolationForest 模型进行异常检测 scikit-learn-extra…

探索网络深处:爬虫技术的奥秘

目录 引言1. 网络的庞大性与信息的丰富性2. 爬虫在收集和分析网络信息方面的重要作用 一、 什么是爬虫?二、爬虫的应用领域三、爬虫的工作流程四、爬虫技术所面临的挑战与解决方案五、爬虫技术设计的伦理与法律问题文末推荐 引言 网络是一个庞大而丰富的宇宙&#…

ChatGPT已成澳洲“懒学生”们最爱,各大学加强检查人工智能辅助作弊行为!

据报道,越来越多的学生开始使用人工智能来写作业,但各所大学也在加倍努力,想方设法将他们一网打尽。 ▲图片来源于网络 悉尼大学透露,2023年有330份作业是用人工智能完成的,而新南威尔士大学最近也表示,他…

【yolo算法水果新鲜程度检测】

Yolo(You Only Look Once)系列算法是一类流行的一阶段实时目标检测模型,在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐,可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

在Spring Boot 2.x中,可以通过添加Redis的依赖来整合Redis

在Spring Boot 2.x中&#xff0c;可以通过添加Redis的依赖来整合Redis。 首先&#xff0c;您需要在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis<…

Java基础-正则表达式

文章目录 1.基本介绍2.正则底层实现1.matcher.find()完成的任务2.matcher.group(0)分析1.源代码2.解释&#xff08;不分组&#xff09;3.解释&#xff08;分组&#xff09; 3.总结 3.正则表达式语法1.基本介绍2.元字符的转义符号1.基本介绍2.代码实例 3.字符匹配符1.基本介绍2.…

HTML_CSS学习:表格、表单、框架标签

一、表格_跨行与跨列 1.相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格_跨行与跨列</title> </head> <body><table border"1" cellspacing"0&qu…

学员分享丨学习华为认证,为什么建议报班学习

我一直对计算机科学有着浓厚的兴趣&#xff0c;但在我遇见誉天教育之前&#xff0c;我只是独自摸索&#xff0c;没有明确的方向和方法。然而&#xff0c;在誉天教育&#xff0c;我找到了一个真正为学生着想的地方。这里有一支专业且热情的教师队伍&#xff0c;他们不仅在课堂上…

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…

C enum(枚举)

枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&#xff0c;需要使用 enum 关…