序列化与反序列化详解

一、核心定义

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. 两者核心是完成 "临时数据" 与 "持久 / 可传输数据" 的相互转换,支撑跨程序、跨平台的数据交互。
相关推荐
MSTcheng.2 小时前
【C++STL】map / multimap 保姆级教程:从底层原理到实战应用!
开发语言·c++·stl·map·红黑树
ULTRA??2 小时前
基于range的函数式编程C++,python比较
c++·python·kotlin·c++20
闻缺陷则喜何志丹2 小时前
【计算几何 二分查找】P5485 [JLOI2010] 铁人双项比赛|普及+
c++·数学·二分查找·计算几何·洛谷
..空空的人2 小时前
C++基于protobuf实现仿RabbitMQ消息队列---服务器模块认识1
服务器·开发语言·c++·分布式·rabbitmq·protobuf
晨非辰3 小时前
基于Win32 API控制台的贪吃蛇游戏:从设计到C语言实现详解
c语言·c++·人工智能·后端·python·深度学习·游戏
小此方3 小时前
Re: ゼロから学ぶ C++ 入門(六)类和对象·第三篇:运算符重载
开发语言·c++·后端
2301_789015623 小时前
每日精讲:环形链表、两个数组中的交集、随机链表的复制
c语言·数据结构·c++·算法·leetcode·链表·排序算法
2301_789015624 小时前
C++:二叉搜索树
c语言·开发语言·数据结构·c++·算法·排序算法
leiming611 小时前
C++ vector容器
开发语言·c++·算法