1.序列化

变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,不过意思都是一样的。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

用于序列化的两个模块:
  json:用于字符串和Python数据类型间进行转换
  pickle: 用于python特有的类型和python的数据类型间进行转换
  json提供四个功能:dumps,dump,loads,load
  pickle提供四个功能:dumps,dump,loads,load

2.在python中实现序列化

Python提供了pickle模块来实现序列化。

(1) 首先,把一个对象序列化并写入文件:

>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d) b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

(2) pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

(3) 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d {'age': 20, 'score': 88, 'name': 'Bob'}

变量的内容又回来了!当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

(4) pickle.load(file,*,fix_imports=True, encoding="ASCII", errors="strict"):必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数

# load功能 2
# load 从数据文件中读取数据,并转换为python的数据结构 
with open('D:/tmp.pk', 'r') as f:
     data = pickle.load(f)

3.在实际的后台开发中的使用

import pickle
#pickle提供一个简单的持久化功能,可以将对象以字节文件的形式存放在磁盘上
#在这里还是使用了redis数据库存放数据
redis_first.set(self.session_id,str(pickle.dumps(self)),ex=60)
session_id = ‘*******’
recording = redis_first.get(session_id)
pikle.loads(eval(recording))#将str类型转换为bytes,再通过pickle装换成对象