- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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对象进行深
您可能关注的文档
最近下载
- 电线电缆原材料采购控制程序.doc VIP
- GB50736-2012 民用建筑供暖通风与空气调节设计规范.pdf VIP
- 立体结构逻辑图( 112页).pptx VIP
- 小学“后进生”的成因及转化策略探讨 .pdf VIP
- SJT 11329-2006 数字电视接收设备接口规范 第3部分:复合视频信号接口.pdf VIP
- GB50086-2015 岩土锚杆与喷射混凝土支护工程技术规范.docx
- 劳务派遣招投标书.doc VIP
- 与听力学有关的国家标准听力计检定与声场校准讲解课件.ppt VIP
- 乳品品鉴师(三级)技能鉴定备考试题库(附答案).docx VIP
- 2025义务教育化学课程标准考试题库及答案.docx VIP
文档评论(0)