Python pickle 二进制序列化和反序列化.docx

Python pickle 二进制序列化和反序列化.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Pythonpickle二进制序列化和反序列化

模块pickle实现了对一个Python对象结构的二进制序列化和反序列化。pickling是将Python对象及其所拥有的层次结构转化为一个字节流的过程,而unpickling是相反的操作,会将(来自一个binaryfile或者bytes-likeobject的)字节流转化回一个对象层次结构。pickling(和unpickling)也被称为序列化,编组1或者平面化。而为了避免混乱,此处采用术语封存(pickling)和解封(unpickling)。

pickle模块并不安全。你只应该对你信任的数据进行unpickle操作。

构建恶意的pickle数据来在解封时执行任意代码是可能的。绝对不要对不信任来源的数据和可能被篡改过的数据进行解封。

请考虑使用hMac来对数据进行签名,确保数据没有被篡改。

在你处理不信任数据时,更安全的序列化格式如json可能更为适合。

与json模块的比较

在pickle协议和JSON(JavaScriptObjectNotation)之间有着本质上的差异:

JSON是一个文本序列化格式(它输出unicode文本,尽管在大多数时候它会接着以utf-8编码),而pickle是一个二进制序列化格式;

JSON是我们可以直观阅读的,而pickle不是;

JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;

默认情况下,JSON只能表示Python内置类型的子集,不能表示自定义的类;但pickle可以表示大量的Python数据类型(可以合理使用Python的对象内省功能自动地表示大多数类型,复杂情况可以通过实现specificobjectAPIs来解决)。

不像pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。

Pickle的基本用法

序列化(Pickling)

要将Python对象序列化为二进制数据,可以使用pickle.dump()函数。以下是一个简单的示例,将一个Python列表保存到文件中:

importpickle

data=[1,2,3,4,5]

#打开一个文件以写入二进制数据

withopen(data/data.pkl,wb)asfile:

pickle.dump(data,file)

在上述代码中,使用pickle.dump()函数将data列表序列化为二进制数据,并将其保存到名为data.pkl的文件中。参数wb表示以二进制写入模式打开文件。

反序列化(Unpickling)

要从文件中加载并反序列化二进制数据,可以使用pickle.load()函数。以下是加载data.pkl文件并还原Python对象的示例:

importpickle

#打开文件以读取二进制数据

withopen(data/data.pkl,rb)asfile:

loaded_data=pickle.load(file)

print(反序列化%s%loaded_data)

在上述代码中,使用pickle.load()函数从data.pkl文件中加载数据,并将其还原为Python对象。

Pickle的工作原理

pickle模块的工作原理涉及到将Python对象转换为一种可序列化的中间格式,然后再将该中间格式序列化为二进制数据。这个中间格式是一个自包含的表示对象的字典,其中包含了对象的数据和其类型信息。

当使用pickle.dump()序列化对象时,pickle模块首先创建一个包含对象数据和类型信息的中间字典。然后,它将该字典转换为二进制数据。反序列化时,pickle模块将二进制数据还原为中间字典,然后再从字典中还原Python对象。

这种方法使pickle模块非常灵活,因为它可以序列化几乎所有Python对象,包括自定义对象,只要它们可以在中间字典中表示。

Pickle的适用场景

pickle模块在以下情况下非常有用:

数据持久化:你可以使用pickle将Python对象保存到文件中,以便稍后读取。这对于保存模型、配置文件、数据缓存等非常有用。

数据传输:你可以使用pickle将Python对象序列化并通过网络传输,以便不同的Python程序之间共享数据。

对象复制:你可以使用pickle将Python对象进行深

文档评论(0)

139****7676 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档