Python-序列化


术语“对象序列化”是指将对象的状态转换为字节流的过程。一旦创建,该字节流可以进一步存储在文件中或通过套接字等传输。另一方面,从字节流重建对象称为反序列化。

Python 的序列化和反序列化术语分别是 pickling 和 unpickling。Python 标准库中的pickle 模块提供了序列化(dump() 和dumps())和反序列化(load() 和loads())的函数。

pickle 模块使用非常 Python 特定的数据格式。因此,不是用 Python 编写的程序可能无法正确反序列化编码(腌制)的数据。此外,从未经身份验证的来源中解封数据也不被认为是安全的。

泡菜协议

协议是在二进制数据之间构造和解构 Python 对象时使用的约定。目前pickle模块定义了5种不同的协议,如下所示:

先生。 协议及说明
1

协议版本0

原始的“人类可读”协议向后兼容早期版本。

2

协议版本1

旧的二进制格式也与早期版本的 Python 兼容。

3

协议版本2

Python 2.3 中引入的新样式类提供了高效的 p​​ickle。

4

协议版本3

Python 3.0 中添加。当需要与其他 Python 3 版本兼容时推荐使用。

5

协议版本4

在 Python 3.4 中添加。它增加了对非常大的对象的支持。

要了解 Python 安装的最高和默认协议版本,请使用pickle模块中定义的以下常量-

>>> import pickle
>>> pickle.HIGHEST_PROTOCOL
4
>>> pickle.DEFAULT_PROTOCOL
3

pickle模块的 dump() 和 load() 函数执行 pickle 和 unpickle Python 数据。dump() 函数将 pickled 对象写入文件,而 load() 函数将数据从文件 unpickle 到 Python 对象。

转储()和加载()

以下程序将字典对象pickle到二进制文件中。

import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

当执行上述代码时,字典对象的字节表示将存储在 data.txt 文件中。

要将二进制文件中的数据取消或反序列化回字典,请运行以下程序。

import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()

Python 控制台显示从文件读取的字典对象。

{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}

转储() 和加载()

pickle 模块还包含 dumps() 函数,该函数返回 pickle 数据的字符串表示形式。

>>> from pickle import dump
>>> dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring=dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'

使用loads()函数对字符串进行unpickle并获取原始字典对象。

from pickle import load
dct=loads(dctstring)
print (dct)

它将产生以下输出-

{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

腌制类

pickle 模块还定义了 Pickler 和 Unpickler 类。Pickler 类将 pickle 数据写入文件。Unpickler 类从文件中读取二进制数据并构造 Python 对象。

编写Python对象的pickle数据 -

from pickle import pickler
f=open("data.txt","wb")
dct={'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close()

Unpickler类

通过取消二进制文件读回数据 -

from pickle import Unpickler
f=open("data.txt","rb")
dct=Unpickler(f).load()
print (dct)
f.close()

所有 Python 标准数据类型的对象都是可挑选的。此外,自定义类的对象也可以进行 pickle 和 unpickle。

from pickle import *
class person:
   def __init__(self):
      self.name="XYZ"
      self.age=22
   def show(self):
      print ("name:", self.name, "age:", self.age)
p1=person()
f=open("data.txt","wb")
dump(p1,f)
f.close()
print ("unpickled")
f=open("data.txt","rb")
p1=load(f)
p1.show()

Python 库还有 marshal 模块,用于 Python 对象的内部序列化。