Python序列化

Posted by Csming on 2017-04-24

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling


序列化

被序列化后,可以将序列化后的内容写入磁盘,或者通过网络传输到别的机器上;

相反,把变量从序列化的对象重新读入内存,则成为反序列化:unpicking;

Python提供 pickle 模块实现序列化

pickle.dumps将任意对象序列化为bytes;然后就可以将这个bytes写入文件了;

1
2
3
import pickle
d = dict(name='Bob', age=20, score=88)
print(pickle.dumps(d))

pickle.dump方法,将对象序列化后,写入一个file-like Object;

1
2
3
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()

可以使用pickle.loads方法反序列出磁盘中读出的bytes;
pickle.load方法从file-like Object中直接反序列出对象;

1
2
3
4
5
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
d
# {'age': 20, 'score': 88, 'name': 'Bob'}

JSON

我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式;
比如XML,JSON格式;

JSON表现出的是一个字符串,能够被所有语言读取,也能够方便的存储到磁盘或通过网络传输;


Python内置json模块,提供python对象到JSON的转换;

json.dumps方法返回一个str,内容是标准的JSON
json.dump方法将JSON写入一个file-like Object

1
2
3
import json
d = dict(name='Bob', age=20, score=88)
print(json.dumps(d))

相反的:
json.loads方法和load方法,将JSON的字符串反序列化


JSON进阶

有时,我们希望用class表示对象,然后将其序列化;
(java中可以用Gson直接实现)


那么,Python中要怎么做呢;

在json.dumps方法中出了第一个必须有的obj参数外,dumps还提供可选参数以方便定制JSON序列;

可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可

1
2
3
4
5
6
7
8
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}

print(json.dumps(s, default=student2dict))

案例来自廖雪峰前辈的博客:http://www.liaoxuefeng.com/
参考资料:http://www.liaoxuefeng.com/