本库主要提供了把Python数据保存到磁盘文件的功能。pickle和marshal模块能够把多种Python数据类型的数据生成一个字节流,然后从字节流创建一个对象。不同类型的DB管理模块支持HASH的映射字符串保存。
9.1 pickle--Python对象序列化操作
本模块主要提供了二进制协议来对Python对象结构进行序列化和反序列化的操作,事实上就是把一个内存里的对象保存到磁盘文件,以便以后能够再从磁盘文件上恢复过来。
9.1.1 与其他Python模块的关系
与模块marshal相比:
Python内部有一个模块marshal也实现了基本对象的序列化操作。而且它被使用来保存Python生成的代码为.pyc文件。可是模块pickle更通用一些,适用的场合更广泛一些,因此优先使用pickle。两者主要区别例如以下:
l 模块pickle拥有对一个对象已经被序列化过的跟踪。避免这个对象再次被序列化,相反模块marshal不具备这种功能。由于在序列化递归和共享对象时,就须要能识别出来那些已经被序列化了,而那些还没有,所以marshal不能用于递归的对象序列化,假设使用marshal去序列化递归的对象就会导致Python解析器崩溃。
另一种情况,就是一个对象被多个地方引用,在模块pickle仅仅会序列化一次。而模块marshal会序列化多次。这样就非常难保证引用计数的正确性。
l 模块marshal不能用来序列化用户自定义的类和它的实例。而模块pickle是能够。
l 模块marshal序列化的格式不能使用于不同的Python版本号,由于它主要的作用就是用来保存.pyc文件,它不保持向前兼容旧版本号的Python的功能。而模块pickle是保持不同Python版本号之间进行兼容。
与json格式比較:
l JSON是一个文本格式的序列化协议,而pickle是二进制格式的序列化协议。
l JSON是一个人类可读取内容的协议。而pickle不行。
l JSON是广泛使用在Python语言之外。而pickle仅仅使用在Python语言之内。
l JSON缺省情况仅仅能表示一个Python内置的数据类型,而不能表示用户自定义的类型。而pickle是能够。
9.1.2 数据流格式
模块pickle生成的数据流格式仅仅能使用在Python领域。不像其他JSON或XDR的标准,所以其他语言想訪问这种格式就会比較麻烦。默认的情况下,pickle是採用比較节省的二进制格式表示。假设还想降低数据流的大小,能够使用压缩模块对它进地压缩。
假设分析pickle产生的数据流格式,能够使用模块pickletools的功能来实现。pickle总共开发了5个版本号。在Python3.4版本号使用的是第4个版本号协议格式。
蔡军生 QQ:9073204 深圳