Pickle 是 Python 默认对象序列化工具,用于保存对象状态和重建逻辑,依赖解释器、类定义及代码版本,存在兼容性与安全风险;支持基本类型、顶层函数、类实例等,不支持文件对象、嵌套类等;可通过 __getstate__ 和 __setstate__ 控制序列化行为;协议版本 0–5 影响性能与兼容性;反序列化不受信任数据会导致 RCE,应优先选用 JSON、Protocol Buffers 等安全替代方案。
Pickle 是 Python 默认的对象序列化工具,它能把内存中的对象转换成字节流,便于存储或传输,之后还能原样还原。但它的核心不是“存数据”,而是“保存对象的状态和重建逻辑”——这意味着它依赖 Python 解释器、类定义、模块路径,甚至代码版本。用不好容易报错、不兼容、甚至有安全风险。
支持的类型包括:基本数据类型(int/str/list/dict/tuple/set)、函数(仅限顶层定义的函数,不能是 lambda 或嵌套函数)、类实例(要求类在模块顶层且可被 import)、大多数内置类型(如 datetime、Decimal)。
常见失败情况:
AttributeError: Can't pickle local object
__reduce__ 但返回非法格式时会出错默认情况下,pickle 会保存对象的整个 __dict__。如果想排除某些属性(比如临时缓存、打开的文件句柄),或需要自定义重建逻辑,就该重写这两个方法:
__getstate__ 返回一个字典,表示“你想保存哪些状态”。可以删掉不可序列化的字段,或替换为可序列化的值__setstate__ 接收这个字典,在反序列化时手动恢复对象状态,比
如重新打开资源、重建缓存例如:
class CacheHolder:Pickle 协议从 0 到 5(Python 3.8+ 支持),数字越大功能越强、体积越小、速度越快,但也越不兼容旧版本:
显式指定协议更稳妥:pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) 或固定值(如 4)。
pickle 在反序列化时会动态执行代码(如导入模块、调用 __reduce__ 返回的函数)。恶意构造的字节流可以触发任意命令执行,等同于远程代码执行(RCE)。
安全替代方案:
记住:pickle 是 Python 内部工具,不是通用数据交换格式。