本库主要提供了把Python数据保存到磁盘文件的功能。pickle和marshal模块可以把多种Python数据类型的数据生成一个字节流,然后从字节流创建一个对象。不同类型的DB管理模块支持HASH的映射字符串保存。
本模块主要提供了二进制协议来对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是可以。
模块pickle生成的数据流格式只能使用在Python领域,不像其它JSON或XDR的标准,所以其它语言想访问这种格式就会比较麻烦。默认的情况下,pickle是采用比较节省的二进制格式表示。如果还想减少数据流的大小,可以使用压缩模块对它进地压缩。如果分析pickle产生的数据流格式,可以使用模块pickletools的功能来实现。pickle总共开发了5个版本,在Python3.4版本使用的是第4个版本协议格式。
蔡军生 QQ:9073204 深圳