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

server/2024/10/17 23:36:44/

文章目录

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

序列化&&反序列化

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

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

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/server/128695.html

相关文章

【含文档】基于Springboot+Android的公交系统查询与设计(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

Spring Boot:医院管理的数字化转型

5系统详细实现 5.1 医生模块的实现 5.1.1 病床信息管理 医院管理系统的医生可以管理病床信息,可以对病床信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 病床信息管理界面 5.1.2 药房信息管理 医生可以对药房信息进行添加,修改,…

react-问卷星项目(5)

实战 路由 路由设计,网址和页面的关系,就是从业务上分析需要哪些页面哪些页面内容可以抽离,业务流程要有入有出增加页面和Layout模版,模版就是抽离页面公共部分,比如都有顶部或者左侧导航,直接上代码&…

Kafka的基本概念整理

1、Kafka是什么? Kafka是由Scala语言开发的一个多分区、多副本,基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢? 回答这个问题要从发展的角度来看:起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受居民的喜爱,社区互助服务管理系统小程序被居民普遍使用,为…

sicp每日一题[2.35]

十一去喀纳斯玩了2天,今天恢复,才几天没看书再看到代码就感到有点陌生了。。 Exercise 2.35 Redefine count-leaves from Section 2.2.2 as an accumulation: (define (count-leaves t)(accumulate ⟨??⟩ ⟨??⟩ (map ⟨??⟩ ⟨??⟩)))这道题难…

Java Stream流的应用场景

Java Stream流的应用场景 Java Stream是Java 8引入的一种高效、简洁的数据处理机制,它提供了一种声明式的方式来处理数据集合。Stream可以对集合进行过滤、映射、排序等操作,并且可以支持并行处理,极大地提高了数据处理的效率和代码的可读性…

【AI知识点】残差网络(ResNet,Residual Networks)

残差网络(ResNet,Residual Networks) 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构,在深度学习领域取得了巨大的成功。它通过引入残差连接(Residual Connection) 解决了深层神经网络中…