序列化和反序列化

为什么要序列化

文件是字节序列,所以必须把内存中数据转换成字节序列,输出到文件.这就是序列化.反之,从文件的字节序列恢复到内存,并且还原类型,就是反序列化.

定义

  • 序列化:就是把不可传输的对象转换为可存储或可传输的过程
  • 反序列化:就是把在磁盘,等介质中的数据转换为对象

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)