Python 序列化与反序列化指南
1. 序列化概述
在程序运行过程中,所有变量(比如字典、列表、自定义类实例)都临时存储在内存堆栈里,程序一结束,这些内存就会被操作系统回收释放。
但我们经常有「把数据带出去」的需求:比如保存游戏存档下次接着玩、爬虫爬取到的数据存到本地缓存、前后端/微服务之间通过API交换结构化数据……这时就需要把内存中的对象,转换为可存储(存文件/数据库)、可传输(发网络请求)的格式——这个过程就叫序列化(在Python的二进制专属工具里也叫「pickling」,腌制数据)。
反之,把序列化后的「扁平数据」重新还原成内存中能直接操作的对象,就是反序列化(unpickling,解腌)。
接下来,我们就来聊聊Python里最常用的两种序列化方案。
2. Python pickle 模块
Python 自带的 pickle 是最简单直接的二进制专属序列化工具,它能处理几乎所有Python内置类型、甚至带方法的自定义类实例。
2.1 基本用法
核心只有4个API:
dumps(obj):把对象序列化为bytes二进制串dump(obj, file):把对象直接序列化写入文件对象loads(bytes):从二进制串反序列化回对象load(file):从文件对象反序列化回对象
2.2 pickle 的局限性
pickle 虽然方便,但适用场景非常窄,主要有3个硬伤:
- Python 绝对专属:其他语言(Java、Go、JS)完全读不懂pickle二进制串,只能用于同Python环境的数据交换。
- 版本兼容性差:不同Python大版本(比如2.x和3.x)甚至小版本(比如3.8和3.12)生成的pickle文件可能不兼容。
- 高危安全漏洞:千万千万不要反序列化不受信任的来源的pickle数据!它本质上是在执行一段Python字节码,恶意构造的pickle文件可能会直接运行任意系统命令(比如删除你的重要文件、窃取隐私)。 :::
3. JSON 序列化
JSON(JavaScript Object Notation)是目前最通用的跨语言文本序列化格式,不仅Python、JS、Java这些主流语言都原生支持,连人类读起来也很清晰。
3.1 数据类型对应表
JSON 是一个「轻量级」格式,只支持6种基本类型,Python 会自动做以下映射:
3.2 基本用法
同样是4个核心API,逻辑和pickle高度一致,但处理的是UTF-8文本/二进制文本串:
3.3 处理中文字符(小技巧)
::: tip 中文显示优化
JSON 默认会把中文字符转义成 \uXXXX 的Unicode编码,虽然不影响程序解析,但人类读起来很麻烦。可以加 ensure_ascii=False 参数强制保留中文,同时记得文件读写都指定 encoding="utf-8" 避免乱码。
4. 序列化自定义对象
JSON 不支持直接处理自定义类实例,需要我们手动做「对象→字典」的转换,有两种常用方法:
4.1 简单方法:直接用 __dict__
如果你的自定义类是简单的数据容器(没有私有属性、没有继承的复杂属性),可以直接用 Python 类默认的 __dict__ 属性——它会自动把实例的所有公开属性转换成字典。
4.2 灵活方法:实现专属 to_dict 和 from_dict
如果你的类有私有属性、继承关系,或者需要标记类信息方便全局反序列化,可以在类内部实现这两个方法:
5. 安全与最佳实践
不管用哪种序列化方案,都要注意以下几点:
- pickle 绝对不要碰不受信任的数据——这条说三遍都不为过。
- JSON 要严格验证输入结构——反序列化后可能会拿到不符合预期的字段或类型,比如用
if "user_id" not in data或者用pydantic库做数据校验。 - 一定要处理异常——比如JSON格式错误、文件不存在等:
6. 性能优化(大数据场景)
对于GB级以上的大型数据或高频网络请求,标准的 json 模块性能可能不够用,可以考虑以下替代方案:
6.1 更快的JSON库
orjson:目前Python最快的JSON库,返回bytes而不是str,还支持更多Python类型的自动转换(比如datetime、UUID),安装方式:pip install orjsonujson:速度也比标准库快很多,兼容性略好于orjson
6.2 二进制跨语言格式
如果需要更高的压缩率和解析速度,可以放弃文本格式,改用二进制:
MessagePack:和JSON结构类似,但更紧凑,速度更快,安装方式:pip install msgpackProtocol Buffers:谷歌官方的严格结构化二进制格式,性能最高,但需要先定义.proto数据结构文件
7. 总结
选择序列化方案时,根据你的核心需求权衡即可:
最后再强调一遍:安全第一,pickle只信自己!

