Python 序列化自定义的类
目前主要的序列化模块是pickle和json。
接下来,我们把之前的我们自定义的树节点TreeNode类进行序列化。
TreeNode类代码参见Python 数据结构 tree 树
Pickle模块
pickle 可能是使用最多的序列化模块了。
cPickle是它的 C 语言实现,相比具有较好的性能。(推荐优先使用 cPickle)
pickle提供的接口
- dump() 序列化对象到文件
- dumps() 序列化对象,返回字符串
- load() 从文件加载对象
- loads() 从字符串加载对象
由于pickle支持的数据类型广泛
- 如数字、布尔值、字符串
- 只包含可序列化对象的元组、字典、列表等,非嵌套的函数、类
- 通过类的
__dict__
或者__getstate__()
可以返回序列化对象的实例
不能支持的数据类型
- 如 sockets 、文件、数据库连接等 (可以通过
__getstate__()
和__setstate__()
进行手动操作)
由于我们的TreeNode类内部的属性都是简单的对象,所以可以使用pickle直接进行序列化。
# build a tree
root = TreeNode('') # root name is ''
a1 = root.add_child('a1')
a1.add_child('b1')
a1.add_child('b2')
a2 = root.add_child('a2')
b3 = a2.add_child('b3')
b3.add_child('c1')
root.dump()
# serialize to a string
s = pickle.dumps(root)
print(s)
# deserialize from the string
new_root = pickle.loads(s)
new_root.dump()
可以看到new_root.dump()
的结果和之前的root.dump()
一样。
但是序列化的结果并不是易于阅读和手工修改, 例如:
(i__main__
TreeNode
p1
(dp2
S'name'</