发布网友 发布时间:2024-10-21 13:27
共1个回答
热心网友 时间:2024-11-11 15:51
零. 前言
pickle 模块实现了对 Python 对象结构的二进制序列化和反序列化,与 json 模块类似。
在pickle 模块中,将 Python 对象序列化转换成二进制格式的过程称为封存,将封存的二进制数据转换回 Python 对象的过程称为解封。
壹. 封存
与 json 模块不同,pickle 模块几乎可以封存任意结构的 Python 对象。使用 pickle.mps() 函数进行封存操作会返回 bytes 类型的结果。
示例中定义了一个名为 test() 的自定义函数,并将其进行封存。pickle.mps() 函数执行后输出了二进制数据。
以下类型可以被封存:内置常量(None, True, False, Ellipsis 和 NotImplemented)、整数、浮点数、复数、字符串、字节串、字节数组、只包含可封存对象的元组、列表、集合和字典、内置函数、使用关键字 def 定义的自定义函数(使用关键字 lambda 定义的匿名函数不可以)。
若要将封存的二进制数据保存到文件中,不需要使用 f.write() 函数。使用 pickle.mp() 函数即可完成封存和保存到文件的操作。
在使用 pickle.mp() 函数时,由于要保存的数据是二进制格式,使用 open() 函数时一定要使用 b 模式创建文件对象。
贰. 解封
可以使用 pickle.loads() 函数解封二进制数据,也可以使用 pickle.load() 函数解封保存有二进制数据的文件。
以下示例中,两种解封方式是等效的:
叁. 总结
pickle 模块功能强大,可以序列化和反序列化任意的 Python 对象,适用于缓存、数据持久化保存、数据传输等应用场景。
需要注意的是,在有服务之间的交互场景中,如果加载了不受信任的数据,会存在安全风险。恶意数据可能会执行任意代码,导致安全漏洞。因此,永远不要从不受信任或不安全的来源加载 pickle 数据。
此外,不同版本的 Python 之间,pickle 数据可能不兼容。升级 Python 版本后,使用旧版本 pickle 数据可能会失败。为了确保兼容性,建议使用特定版本的 Python 和 pickle 模块来保存和加载数据。