序列化与反序列化详解

一、核心定义

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. 两者核心是完成 "临时数据" 与 "持久 / 可传输数据" 的相互转换,支撑跨程序、跨平台的数据交互。
相关推荐
I_belong_to_jesus11 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla12 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu18 小时前
一个通用游戏数据服务器
c++·架构
another heaven18 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP20 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck20 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀21 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光1 天前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu1 天前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
俊俊几年的1 天前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c