Python中对象序列化应根据场景选择:仅Python内部使用且需保留对象类型和行为时选pickle,跨语言交互或需可读性时选json;pickle支持任意Python对象但不安全,json仅支持基础类型且需手动处理datetime等。

Python中对象序列化主要用pickle和json,二者用途不同:pickle用于Python内部数据持久化(支持任意Python对象),json用于跨语言数据交换(只支持基础数据类型)。
什么时候该用pickle
pickle能序列化函数、类实例、嵌套自定义对象等,适合Python程序内部保存状态或缓存。
- 保存训练好的scikit-learn模型、PyTorch模型参数等
- 临时缓存复杂计算结果(如带方法的类实例)
- 进程间传递Python对象(配合multiprocessing)
注意:pickle文件不安全,不能加载不可信来源的数据,否则可能执行任意代码。
什么时候该用json
json生成的是纯文本、人类可读、所有主流语言都支持的格式,适合API通信、配置文件、日志记录。
立即学习“Python免费学习笔记(深入)”;
限制:不能直接序列化datetime、set、自定义类等;需手动转换(例如把datetime转为ISO字符串)。
关键操作对比
以下是最常用写法对比:
- pickle.dump(obj, file) —— 写入二进制文件;pickle.load(file) —— 从文件读取
-
json.dump(obj, file) —— 写入文本文件(需open时指定
encoding='utf-8');json.load(file) —— 从文件读取 - pickle.dumps(obj) → bytes;json.dumps(obj) → str(默认不带编码)
- json支持
default=参数处理不支持类型,例如:json.dumps(obj, default=str)把无法序列化的对象转成字符串表示
选型建议
按需求判断:
- 只在Python里用,要保留对象类型和行为 → 选
pickle - 要和JavaScript/Java/Go等交互,或需要可读性、可编辑性 → 选
json - 数据含中文?json默认支持UTF-8,pickle也支持但需确保文件以二进制模式打开
- 性能敏感?pickle通常更快更紧凑,尤其对大型嵌套结构;json解析慢一点但更安全稳定
不复杂但容易忽略:json不支持tuple(会变成list),而pickle保留tuple类型;若业务逻辑依赖tuple不可变性,这点会影响行为。










