序列化与反序列化详解

一、核心定义

1. 序列化(Serialization)

序列化是将内存中的对象(或数据结构)转换为可存储(如存入文件、数据库)或可传输(如通过网络发送给其他系统)的二进制流(或 XML/JSON 等结构化格式)的过程

简单说,就是把内存中 "活" 的、只能被当前程序直接使用的数据,变成一种 "静态" 的、可脱离当前程序独立存在的数据格式。

2. 反序列化(Deserialization)

反序列化是序列化的逆过程,指将序列化后得到的二进制流(或 XML/JSON 等格式数据)重新转换为内存中的对象(或数据结构),使其能够被程序再次直接操作和使用的过程。

二、核心目的

序列化与反序列化的核心价值是解决数据持久化跨平台 / 跨进程数据传输的问题:

  • 数据持久化:将内存中的临时数据保存到磁盘、数据库等持久化存储介质中,程序重启后可通过反序列化恢复数据(如游戏存档、用户配置保存)。
  • 跨介质 / 跨进程传输:在网络通信(如接口调用、分布式系统通信)、进程间通信中,将数据转换为标准格式进行传输,接收方通过反序列化还原数据(如前端向后端传递 JSON 数据、微服务之间的通信)。

三、通俗类比

可以用 "打包" 和 "解包" 来理解:

  • 序列化 = 打包:把家里的零散物品(内存中的对象)整理装箱(转换为二进制流 / JSON 等格式),方便存放(持久化)或快递(网络传输)。
  • 反序列化 = 解包:收到快递后,将箱子里的物品重新取出、还原成原来的摆放状态(内存中的对象),方便使用。

四、数据形态变化

  • 序列化前:数据以内存对象 / 数据结构形态存在,具有临时性、只能被当前程序直接访问(如 Java 中的 User 对象、Python 中的字典、C# 中的 List 集合)。
  • 序列化后:数据以二进制流、JSON 字符串、XML 字符串等形态存在,具有持久性、可跨环境传输(如文件中的二进制数据、接口返回的 JSON 字符串)。
  • 反序列化后:数据重新恢复为内存对象 / 数据结构形态,可被程序直接调用、修改、遍历等。

五、两者的关联

  1. 互逆性:反序列化是序列化的逆向操作,序列化的输出(序列化后的数据)是反序列化的输入,两者配合完成 "数据保存 / 传输 - 数据恢复使用" 的闭环。
  2. 依赖性:反序列化需要依赖序列化时的规则(如数据格式、对象结构定义),若序列化与反序列化的规则不一致(如序列化用 JSON、反序列化按 XML 解析),会导致反序列化失败或数据错乱。

六、常见示例

  • 前端向后端提交表单数据:前端将表单数据序列化为 JSON 字符串,通过 HTTP 请求传输到后端;后端接收 JSON 字符串后,反序列化为后端语言的对象(如 Java 的 User、Python 的 dict)进行处理。
  • 游戏存档:游戏运行时将玩家等级、装备、进度等数据封装为对象,序列化后保存为本地文件;下次启动游戏时,读取存档文件,通过反序列化还原玩家数据,恢复游戏进度。
  • 分布式系统通信:微服务 A 将业务数据序列化为二进制流,通过 RPC 框架传输到微服务 B;微服务 B 将二进制流反序列化为可操作的对象,执行后续业务逻辑。

总结

  1. 序列化:内存对象 → 可存储 / 传输的格式(打包),解决数据持久化和跨环境传输问题。
  2. 反序列化:可存储 / 传输的格式 → 内存对象(解包),是序列化的逆过程。
  3. 两者核心是完成 "临时数据" 与 "持久 / 可传输数据" 的相互转换,支撑跨程序、跨平台的数据交互。
相关推荐
xxwxx__9 小时前
深入理解 C++ 继承:从基础语法到底层原理全解析
c++
键盘会跳舞10 小时前
【C++多线程】多线程性能调优:伪共享、缓存行对齐与吞吐优化
c++·多线程·多线程调优
学习星球10 小时前
编辑距离——二维 DP 的“最小操作“艺术
c++·leetcode·java-consul
OPEN-F10 小时前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python
暖焰核心10 小时前
迭代器与模板的结合——stl的list
c++·windows·list
j7~10 小时前
【C++】C++的IO流--详解
c++·c++io流·c++流的概念·stringstream的介绍·c语言的输入与输出
zh_xuan11 小时前
c++ string_view
开发语言·c++
FFZero111 小时前
[mpv架构] (4) demux 线程到底在“预读“什么?
c++·架构·音视频·多媒体
西西弗Sisyphus11 小时前
C++ 实现 替代 OpenCV resize INTER_LINEAR 的一种方式
c++·opencv
wabs66611 小时前
关于二叉树【力扣107.二叉树的层序遍历II的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历