当前位置: 首页 > news >正文

序列化与反序列化(一)

注:(此篇重序列化)

一:基础含义

序列化(Serialization)​ 和 反序列化(Deserialization)​ 是计算机中非常基础、也非常常用的概念,用来解决「对象如何在系统之间传输或存储」的问题

  • 序列化:把内存中的对象 → 转换成可存储 / 可传输的格式
  • 反序列化:把存储 / 传输后的数据 → 还原成内存中的对象

二:序列化存在的原因

最大且最根本————转换并储存对象

对象

内存里的对象很脆弱且孤立,而现实世界的数据需要被长久保存或跨系统流动

为什么要转换对象呢?主要有三个原因:

1. 内存断电即失(为了“存得住”)

  • 内存(RAM)​ 就像办公桌,速度快但断电后东西就没了。
  • 如果你不把对象转换成 文件(硬盘)​ 这种格式,程序一旦关闭,内存中的数据就消失了。
  • 转换的目的:把桌上的文件归档到档案柜里,实现持久化

2. 程序不能跨进程(为了“传得动”)

  • 你电脑里的微信(一个程序)和服务器(另一个程序)是互不相连的。内存里的对象无法直接跳过去。
  • 转换的目的:把对象变成一段通用的“字符串”或“字节流”(比如 JSON),通过网络像寄快递一样发过去。

3.不同语言/系统看不懂对方(为了“跨平台”)

  • Java 的对象和 Python 的对象结构完全不同,各自的内存格式也互不兼容。
  • 转换的目的:使用大家都能看懂的通用格式(如 JSON),实现跨语言、跨平台的数据交换。

总结:转换对象,就是为了把“易逝的、私有的”数据,变成“稳定的、通用的”数据,从而能够存下来或者发出去

通过对对象的深刻了解,我们可知

对象与序列化的关系

序列化即将对象的状态信息转换为可以存储或传输的形式的过程(序列化是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化,流(就是I/O)。我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)

在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象

简单来说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信。

三:序列化的过程示意

内存中的对象 ↓ 序列化 JSON / XML / 二进制 ↓ 存储 or 网络传输 JSON / XML / 二进制 ↓ 反序列化 内存中的对象

示例(JSON 为例)

(1)Java 对象

class User { String name; int age; }

(2)序列化(对象 → JSON)

{ "name": "张三", "age": 18 }

(3)反序列化(JSON → 对象)

User user = parseJson(jsonString);

四:常见序列化方式对比

此处用表格举例(内容来至网络查询)

类型特点常见场景
JSON可读性强、跨语言Web API、前后端通信
XML结构严谨、冗长老系统、企业级接口
二进制体积小、速度快Java RMI、游戏、内部 RPC
Protobuf高效、强约束微服务、高性能通信
YAML可读性好配置文件

五:序列化中常用魔术方法

在序列化与反序列化过程中,不同编程语言会定义一些“魔术方法”(Magic Methods / 特殊方法),由运行时在特定阶段自动调用

这里详细列出了PHP,python,Java​ 中常见的魔术方法

(1):PHP 中的序列化魔术方法

  1. __sleep():在序列化前触发,用于返回需要被序列化的属性数组
  2. __wakeup():在反序列化后触发,用于重新初始化资源、连接等
  3. __serialize():在序列化时触发,用于自定义序列化数据
  4. __unserialize():反序列化时触发,用于自定义反序列化逻辑
  5. __toString():对象被当作字符串时触发,常与调试、日志相关

示例:

class User { public $name; public function __sleep() { return ['name']; // 只序列化 name } public function __wakeup() { echo "对象被恢复了"; } }

注:__wakeup()常被用于构造 PHP 反序列化漏洞(POP Chain)

(2):Python 中的序列化魔术方法

Python的pickle模块(知识点补充在末尾)使用魔术方法来控制对象的序列化行为

(题外话:事实证明表格确实比列表更轻松)

方法触发时机说明
__getstate__()序列化时返回要序列化的状态
__setstate__()反序列化时恢复对象状态
__reduce__()序列化时最重要,可指定构造函数
__reduce_ex__()序列化时__reduce__()的高级版本

示例:

import pickle class User: def __init__(self, name): self.name = name def __getstate__(self): return {'name': self.name} def __setstate__(self, state): self.name = state['name']

注:_reduce__()可被用于 任意代码执行,因此 永远不要用 pickle 反序列化不可信数据

(3)Java 中的序列化方法(不是严格意义上的“魔术方法”,但等价)

Java 使用接口 + 特定方法签名来实现序列化控制。

方法作用
writeObject(ObjectOutputStream out)自定义写入对象
readObject(ObjectInputStream in)自定义读取对象
readResolve()替换反序列化后的对象(单例保护)
writeReplace()替换序列化前的对象
serialVersionUID控制版本兼容性

未完待续

知识补充:pickle

pickle是 Python 标准库中的一个序列化模块,作用是:

把 Python 对象转换成字节流(序列化),以及把字节流还原成 Python 对象(反序列化)

即:Python 专属的“对象打包 / 解包工具”(ps:某种意义上)

(注:我会写一篇新的wp介绍pickle,此处不再啰嗦)

http://www.zskr.cn/news/1483827.html

相关文章:

  • ArcGIS Pro 3.0 实战:三步搞定随机点采样,把栅格数据变成Excel表格
  • SpringBoot+Vue校园闲置物品交易平台源码+论文
  • StackGAN-v2架构深度解析:理解堆叠生成对抗网络的秘密
  • OriginPro 2021b 保姆级教程:三步搞定多曲线填充面积图,告别数据遮盖烦恼
  • 别再被MicroLIB坑了!N32G45X串口打印printf的两种正确打开方式(Keil MDK实战)
  • 【花雕学编程】Arduino BLDC 之自主避障式辐射侦察机器人
  • 多平台电商通用采集技术:一套代码打通1688/淘宝/天猫/拼多多/京东
  • C#逆向分析工具横评:dotPeek、ILSpy、dnSpy、Reflector到底怎么选?附真实案例对比
  • 别再混淆了!一文讲透SAP WM里仓储单位SU、HU和Quant的区别与联系
  • 避坑指南:ADS链路预算仿真时,BudNF控件报错或结果不准?可能是你没用对这个隐藏功能
  • 告别Electron?用Flutter 3.0从零构建你的第一个Windows桌面应用(保姆级避坑指南)
  • 数电课设救星:手把手教你用CD4511驱动数码管,搞定电子时钟的显示部分
  • SAP BAPI调用避坑指南:搞定BAPI_MATERIAL_SAVEDATA更新物料主数据的那些‘坑’
  • 别再用Traffic Lights了!用Proteus8.9里的LED模拟交通灯,Keil C51代码这样写更灵活
  • 别再只用tcpdump了!Linux下用tshark抓包,这5个场景效率翻倍
  • 保姆级避坑指南:Open3D点云边界框(AABB/OBB)与凸包计算,别再搞混了!
  • Three.js ShaderMaterial实战:用两张贴图轻松搞定酷炫墙体流光(附完整代码)
  • BiSeNet V2设计精讲:从‘宽细节’与‘窄语义’的双分支,看轻量级分割网络的设计哲学
  • STM32-编码器接口测速(十七)
  • 别再死记硬背了!用Multisim仿真带你玩转电路、模电、数电核心知识点
  • 神经符号系统中的语义压缩与碰撞模糊问题解析
  • 别再只把DBC当配置文件了!聊聊它在Autosar CAN开发中的三个隐藏用法
  • 2026年智慧路灯性价比排名,君力光电值得选购吗? - myqiye
  • 用ESP32做个会说话的温度计:手把手实现ADC读取与TTS语音播报(Arduino框架)
  • 2026AI培训机构汇总,国内综合实力TOP3是这三家
  • 2026年广州一拍即火传媒GEO推广价格贵不贵? - myqiye
  • ROS性能优化:消息压缩技术在机器人开发中的关键应用
  • STM32F103C8T6最小系统板SPI读写SD卡实战:从供电坑到FATFS文件系统完整指南
  • label-studio部署方式(linux版本)
  • 天津立达在分区导览技术厂家中口碑如何? - mypinpai