序列化和反序列化
序列化和反序列化
- 为什么要序列化
- 定义
- pickle模块
- pickle.dumps(obj, protocol=None, *, fix_imports=True)
- pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")
- 序列化应用
- JSON
- json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- msgpack
为什么要序列化
文件是字节序列,所以必须把内存中数据转换成字节序列,输出到文件.这就是序列化.反之,从文件的字节序列恢复到内存,并且还原类型,就是反序列化.
定义
- 序列化:就是把不可传输的对象转换为可存储或可传输的过程
- 反序列化:就是把在磁盘,等介质中的数据转换为对象
pickle模块
pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议。“Pickling”是将Python对象转换为字节流的过程,“unpickling”是反向操作,由此字节流二进制文件或字节对象)转换回对象结构。
pickle.dumps(obj, protocol=None, *, fix_imports=True)
将对象的腌制表示作为bytes对象返回,而不是将其写入文件。
a = 99
b = 'c'
c = list('123')
d = {'a':1,'b':'abc','c':[1,2,3]}
import pickle
with open('E:/test/ser','wb') as f:
pickle.dump(a,f)
pickle.load(file, *, fix_imports=True, encoding=“ASCII”, errors=“strict”)
从打开的文件对象file读取pickled对象表示形式,并返回其中重新构建的对象层次结构。
with open('E:/test/ser','rb') as f1:
for i in range(6):
x = pickle.load(f1)
print(type(x),x)
下例中,序列化时只保存类名
class AAAA:
BBBB = 'abc'
def bbb(self):
print('+++++++++')
s =AAAA()
ser = pickle.dumps(s)
with open('E:/test/ser3','wb') as f2:
f2.write(ser)
with open('E:/test/ser3','rb') as f3:
x = pickle.load(f3)
print(x)
x.bbb()
序列化应用
JSON
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用此conversion table将obj序列化为JSON格式的str
import json
x = {'a':1,'b':2,'c':['1','2'],'d':{'e':50,'f':[1,2,3]}}
y = json.dumps(x)
print(type(y),x)
print(y)
y1 = json.loads(y)
print(type(y1))
print(y1)
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用此conversion table将包含JSON文档的s(a str实例)解压缩为Python对象
msgpack
安装
pip install msgpack
使用
import msgpack
m = msgpack.dumps(x)
print(type(m),m)
print(len(m))
z = msgpack.loads(m)
print(z)