序列化和反序列化【网络】

news/2024/12/21 23:09:11/

文章目录

  • 序列化&&反序列化
  • 代码

序列化&&反序列化

序列化是将对象的状态信息转换为可以存储或传输的形式(字节序列)的过程。
反序列化是把字节序列恢复为对象的过程

例如:进行在线聊天时,客户端发送的一句消息 ,服务端不单单只收到一条消息,还包含消息内容、发送时间、发送者的昵称等内容
序列化可以理解为,将消息内容、发送时间、发送者的昵称,结构化,再将结构化的数据转换为一个大字符串

struct msg
{
string  Info ;//消息内容
string  time ;//发送时间
string name ;//发送者的昵称
};

反序列化可以理解为,服务端将客户端经过网络发过来的结构化的数据,以对象的方式将结构化的数据打散,拿到Info 、time 、name 这些具体的信息

网络传输时,序列化目的是为了方便网络数据的发送和接收,无论是何种类型的数据,经过序列化后都变成了二进制序列,此时底层在进行网络数据传输时看到的统一都是二进制序列。
序列化后的二进制序列只有在网络传输时能够被底层识别,上层应用是无法识别序列化后的二进制序列的,因此需要将从网络中获取到的数据进行反序列化,将二进制序列的数据转换成应用层能够识别的数据格式。

代码

实现一个网络版本的计算器:
序列化&&反序列化&&自定义协议

bool Serialize(std::string *out) // 序列化{
#ifdef Myself//"9\n"100 + 200\n"// 报头:长度\n// 构建报文的有效载荷,"x op y"std::string s = std::to_string(x);s += blank_space_sep;s += op;s += blank_space_sep;s += std::to_string(y);*out = s;return true;
#else// JSON 格式来序列化数据Json::Value root;root["x"] = x;root["y"] = y;root["op"] = op;// Json::FastWriter w;// 序列化Json::StyledWriter w;*out = w.write(root);return true;#endif}bool DeSerialize(const std::string &in) // 反序列化{
#ifdef Myself//"9\n"100 + 200\n"size_t left = in.find(blank_space_sep);if (left == std::string::npos)return false; // 没有找到// 找到空格std::string part_x = in.substr(0, left);size_t right = in.rfind(blank_space_sep);if (right == std::string::npos)return false; // 没有找到std::string part_y = in.substr(right + 1);// 不是一个完整的报文if (left + 2 != right)return false;op = in[left + 1];x = std::stoi(part_x);y = std::stoi(part_y);return true;
#else// JSON 格式来反序列化数据Json::Value root;Json::Reader r;r.parse(in, root);x = root["x"].asInt();y = root["y"].asInt();op = root["op"].asInt();return true;
#endif}

http://www.ppmy.cn/news/1534693.html

相关文章

python 实现decision tree决策树算法

decision tree决策树算法介绍 决策树算法(Decision Tree Algorithm)是一种基于输入特征对实例进行分类的树结构模型,主要用于分类和回归任务。其基本原理是根据训练数据的特征属性和类别标签之间的关系,生成一个能够对新样本进行…

OSDU轻量化单机部署

首先更新系统 sudo apt update sudo apt upgrade -y安装docker sudo apt install -y docker.io sudo systemctl start docker sudo systemctl enable docker安装minikube curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 …

electron打包报错-winCodeSign无法下载

electron打包报错-winCodeSign下载问题 问题描述 downloaded urlhttps://registry.npmmirror.com/-/binary/electron-builder-binaries/winCodeSign-2.6.0/winCodeSign-2.6.0.7z duration1.577s⨯ cannot execute causeexit status 2outerrorOutERROR: Cannot create s…

使用ESPnet的 setup_anaconda.sh安装脚本一步到位,配置conda虚拟环境

使用ESPnet的 setup_anaconda.sh 安装脚本一步到位,配置conda虚拟环境 前言 ESPnet(End-to-End Speech Processing Toolkit)是一款用于语音识别、语音合成等任务的开源端到端语音处理工具包。为了在不同系统上快速配置ESPnet开发环境&#…

01_OpenCV图片读取与展示

import cv2 img cv2.imread(夕阳.jpg, 1) #cv2.imshow(image, img) #此行只能命令行处py文件执行,会弹出一个视频窗口 #cv2.waitKey (0)以下会在jupyter Lab控件中显示读取的图像 #bgr8转jpeg格式 import enum import cv2def bgr8_to_jpeg(value, quality75):ret…

CSP-J Day 4 模拟赛补题报告

姓名:王胤皓,校区:和谐校区,考试时间: 2024 2024 2024 年 10 10 10 月 4 4 4 日 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00,学号: S 07738 S07738 S07738 请关注作者的…

GS-SLAM论文阅读笔记-CaRtGS

前言 这篇文章看起来有点像Photo-slam的续作,行文格式和图片类型很接近,而且貌似是出自同一所学校的,所以推测可能是Photo-slam的优化与改进方法,接下来具体看看改进了哪些地方。 文章目录 前言1.背景介绍GS-SLAM方法总结 2.关键…

使用CAPTCHA对反爬虫有优势吗

使用CAPTCHA对抗爬虫确实具有一些显著的优势,以下是主要优点和考虑因素: 优势 有效阻止自动化访问 人机验证:CAPTCHA设计用于区分人类用户与机器人,能够有效防止自动化爬虫访问网站内容。阻挡恶意行为:大多数爬虫无法…