2010年3月2日星期二

转 pickle——python对象的串行化

转贴来自&刘鑫的专栏 pickle——python对象的串行化

最近感觉自己虽然玩了3年多的python,但仅仅停留在使用的阶段上,对python的很多内容还不算很了解,打算沉下心来,扎扎实实的学些东西了。
对象的串行化感觉上是很有用的(但自己很少用到),不过还是好好学习下吧。

1)相关的python模块
在python 3.0里,和python相关的模块主要有2个:_pickle,marshal.
其中_pickle是对pickle的优化,是使用C语言对底层进行了一部分的优化。
marshal是python里原生的串行化类,但是在使用上pickle更加优秀,marshal的存在主要是为了支持python的*.pyc文件。
pickle模块和marshal模块有几方面的差别:
1>pickle模块对已串行化的对象进行跟踪,因此对同一个对象的引用不需要再次串行化。marshal不这么做。
对于循环对象而言,他们包括对自己的引用,因此marshal不支持循环对象。
共享对象由于是指有多个实例指向同一个引用,pickle保存一个引用,并使得其他实例都指向该对象,来保证所有实例的一致性。
2>marshal不能用来串行化用户自定义对象和它们的实例。pickle可以串行化这些对象,但前提是类的定义是可以引入的,并且和对象串行化的类在一个模块里。
3>marshal不能跨版本,因为它主要是用来支持*.pyc文件的,解释器不需要保持对以前版本的兼容性。而pickle可以做到这一点。

2)用法
pickle.dump(obj, file[, protocol])
pickle.dumps(obj[, protocol])
pickle.load(file[, *, encoding="ASCII", errors="strict"])
pickle.loads(bytes_object[, *, encoding="ASCII", errors="strict"])

3)异常
exception pickle.PickleError 基本的Error,从Exception继承而来
exception pickle.PicklingError 当一个不支持Pickle的对象被pickle被激发
exception pickle.UnpicklingError Unpickle出错时被激发,例如数据损坏或安全问题

4)可以被pickle的对象
None,True,False
数字,复数
字符串,字符集
元组,列表,集合,字典
模块的顶层函数、内置函数、类