序列化与反序列化详解

一、核心定义

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. 两者核心是完成 "临时数据" 与 "持久 / 可传输数据" 的相互转换,支撑跨程序、跨平台的数据交互。
相关推荐
ShineWinsu42 分钟前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
h_a_o777oah1 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
帅气的小峰1 小时前
pybind11与nanobind可以共存吗?如何迁移?
c++·python·cuda·推理引擎
syker1 小时前
SuperNova Compiler v4.2.9 完整开发手册
c++
zhy295631 小时前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
richard_yuu2 小时前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json
郝学胜-神的一滴2 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
ShineWinsu11 小时前
对于C++:IO流状态的详细解析
c++·面试·io·cin·io流状态·goodbit·failbit
Lzg_na12 小时前
constexpr的优势
c++
王维同学14 小时前
进程模块枚举、映像身份与线程启动地址关联
c++·windows·安全