序列化
Python 序列化与反序列化指南
1. 序列化概述
在程序运行过程中,变量存储在内存中。当程序结束时,内存会被操作系统回收。为了持久化数据,我们需要将内存中的对象转换为可存储或传输的格式,这个过程称为序列化(在Python中称为pickling)。反之,将序列化后的数据重新转换为内存中的对象称为反序列化(unpickling)。
2. Python pickle 模块
Python 提供了 pickle 模块来实现序列化。
2.1 基本用法
2.2 pickle 的局限性
- Python 专属:只能用于 Python 程序之间交换数据
- 版本兼容性:不同 Python 版本可能不兼容
- 安全性问题:不要反序列化不受信任的来源的数据,可能执行恶意代码
3. JSON 序列化
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,具有跨语言、易读的特点。
3.1 基本数据类型对应关系
3.2 基本用法
3.3 处理中文字符
4. 序列化自定义对象
4.1 简单方法:使用 __dict__
4.2 更灵活的方法:实现序列化方法
5. 安全注意事项
- 不要反序列化不受信任的 pickle 数据 - 可能执行任意代码
- 验证 JSON 输入 - 确保数据结构符合预期
- 处理异常 - 反序列化可能失败,需要捕获异常
6. 性能优化
对于大型数据结构:
- 使用
ujson或orjson替代标准json模块提高速度 - 考虑使用二进制格式如
MessagePack或Protocol Buffers处理大数据
7. 总结
- Python 内部使用:
pickle模块,高效但不安全且不跨语言 - 跨语言数据交换:
json模块,安全、跨语言但性能较低 - 自定义对象:实现
to_dict()和from_dict()方法 - 中文处理:使用
ensure_ascii=False - 安全:始终验证输入,处理异常
- 性能:对于大型数据考虑替代方案
选择序列化方法时,应根据具体需求权衡安全性、性能和兼容性。

