Python对象序列化

序列化是将对象转换为可以存储/保存(在文件或内存缓冲区中)的格式的过程,因此我们可以稍后对其进行反序列化,并从序列化的格式中恢复原始内容/对象。我们将使用python pickle模块执行所有这些操作。

什么是酸洗?

Python pickle模块用于对python对象结构进行序列化和反序列化。将任何种类的python对象(列表,字典等)转换为字节流(0和1)的过程称为酸洗或序列化或展平或封送处理。我们可以通过称为解酸的过程将字节流(通过酸洗生成)转换回python对象。

要腌制一个物体,我们只需要-

  • 进口泡菜

  • 调用dumps()函数

import pickle

class Vehicle:

   def __init__(self, number_of_doors, color):

      self.number_of_doors = number_of_doors

      self.color = color

class Car(Vehicle):

   def __init__(self, color):

      Vehicle.__init__(self, 5, color)

Maruti = Car('Red')

print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))

pickle_Maruti = pickle.dumps(Maruti)

print('Here is my pickled Vehicle: ')

print(pickle_Maruti)

输出结果

My Vehicle Maruti is Red and has 5 doors

Here is my pickled Vehicle:

b'\x80\x03c__main__\nCar\nq\x00)\x81q\x01}q\x02(X\x0f\x00\x00\x00number_of_doorsq\x03K\x05X\x05\x00\x00\x00colorq\x04X\x03\x00\x00\x00Redq\x05ub.'

在上面的示例中,我们创建了Car类的实例,然后对其进行了腌制,将car实例转换为简单的字节数组。腌制完汽车实例后,我们可以轻松地将其存储在二进制文件或db字段中,以后再还原它,以将这些字节转换回对象层次结构。

注意:如果我们要创建一个带有腌制对象的文件,则需要使用dump()方法而不是dumps()方法。

解开

这是逆(或酸洗)操作,在此我们将二进制流转换为对象层次结构。

使用load()pickle模块的功能来完成解腌,并从字节流中返回完整的对象层次结构。

以下是负载

import pickle

class Vehicle:

   def __init__(self, number_of_doors, color):

      self.number_of_doors = number_of_doors

      self.color = color

class Car(Vehicle):

   def __init__(self, color):

      Vehicle.__init__(self, 5, color)

Maruti = Car('Red')

print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))

pickle_Maruti = pickle.dumps(Maruti)

#Now, let's unpickle our car Maruti creating another instance, another car ... unpickle_Maruti

Hyundai = pickle.loads(pickle_Maruti)

#Set another color of our new instance

Hyundai.color = 'Black'

print(str.format("Hyundai is {0} ", Hyundai.color))

print(str.format("Maruti is {0} ", Maruti.color))

在上面的示例中,您可以看到我们对第一个汽车对象(Maruti)进行了腌制,然后将其对另一个变量(Hyundai)进行了腌制,因此在某种意义上我们已经克隆了Maruti以创建现代汽车。

输出结果

My Vehicle Maruti is Red and has 5 doors

Hyundai is Black

Maruti is Red

泡菜vs JSON

JSON代表Javascript Object Notation(Java语言对象表示法),是一种用于数据交换的轻量级格式,并且人类可读。相对于pickle,JSON的一大优势在于它是标准化的并且与语言无关。它比泡菜安全得多,速度也更快。

代替泡菜的另一种选择是cPickle,它非常类似于泡菜,但是用C语言编写,速度快了1000倍。您可以将相同的文件用于pickle和cPickle。

import json

mylist = [2, 4, 5, "ab", "cd", "ef"]

print("Here is my list: ", mylist)

json_string = json.dumps(mylist )

print("Here is my json encoded object: ", json_string)

print ("Here is JSON back to a data structure: ",json.loads(json_string))

输出结果

Here is my list: [2, 4, 5, 'ab', 'cd', 'ef']

Here is my json encoded object: [2, 4, 5, "ab", "cd", "ef"]

Here is JSON back to a data structure: [2, 4, 5, 'ab', 'cd', 'ef']

在上面的代码中,我们首先获取对象(我的列表),然后使用“ dumps”方法返回字符串,然后将JSON加载回数据结构,我们使用“ loads”方法将字符串转换为JSON对象数据结构。

以上是 Python对象序列化 的全部内容, 来源链接: utcz.com/z/331324.html

回到顶部