程序运行时,所有的变量都是在内存中的。程序一结束或意外中断,程序中的内存变量都会被操作系统进行回收。
把内存中的变量变成可存储或可传输的过程,就是序列化。将内存中的变量序列化之后,可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的对象重新读取到内存,称为反序列化。
在Python中提供了两个模块:cPickle和pickle来实现序列化。前者是由C语言编写的,效率比后者高很多,但是两个模块的功能是一样的。在编写程序时,一般先导入 cPickle 模块,如果此模块不存在,再导入 pickle 模块:
try:
import cPickle as pickle
except ImportError:
import pickle
序列化
pickle实现序列化主要使用的是 dumps 方法或 dump 方法:
- dumps方法可以将任意对象序列化成一个str,然后可以将这个str写入文件进行保存。
d = pickle.dumps(Object)
- dump方法可以将序列化后的对象直接写入文件中:
file = open("filepath","w")
d = pickle.dump(Object,file)
反序列化
pickle实现反序列化使用的是loads方法或load方法。把序列化后的文件从磁盘上读取为一个str,然后使用loads方法将这个str反序列化为对象,或者直接使用load方法将文件反序列化为对象:
file = open("filepath","r")
d = pickle.load(file)
file.close()
序列化的意义
如果要在不同的编程语言之间传递对象,把对象序列化为标准格式是关键,例如JSON,它既可以被所有的编程语言读取解析,也可以方便地存储到磁盘或者通过网络传输。