python的序列化和反序列化
一、序列化和反序列化
1、为什么要序列化
要设计一套协议,按照某种规则,把内存中数据保存到文件中,文件是一个字节序列,所以必须 把数据转换成字节序列,输出到文件,这就是序列化,反之,从文件的字节序列恢复到内存中,这就是反序列化
2、序列化(serialization)的定义
3、反序列化(deserialization)的定义
二、序列化和反序列化模块
三、文件序列化和反序列化
>>> import pickle >>> with open(file,'wb') as f: s1 = 99 s2 = 'abc' s3 = ['a','b',['c','d']] #序列化 pickle.dump(s1,f) pickle.dump(s2,f) pickle.dump(s3,f) #反序列化 >>> with open(file,'rb') as f: s = [] for i in range(3): s.append(pickle.load(f)) >>> print(s) [99, 'abc', ['a', 'b', ['c', 'd']]] >>>
四、对象序列化
1、对象序列化
>>> class AA: ttt = 'ABC' def show(self): print('abc') >>> a1 = AA() >>> sr = pickle.dumps(a1) #序列化对象 >>> print('sr={}'.format(sr)) sr=b'\x80\x03c__main__\nAA\nq\x00)\x81q\x01.' >>> a = pickle.loads(sr) # 反序列化对象 >>> print(a.ttt) ABC >>> 上面的例子中,其实就是保存了一个类名,因为所有的其他东西都是类定义的,是不变的 所以只序列化AA类名,反序列化的时候找到类就可以恢复一个对象
2、对象序列化改进
对象序列化2 >>> class AAA: def __init__(self): self.tttt = 'abc' >>> b1 = AAA() >>> sr = pickle.dumps(b1) >>> print('sr={}'.format(sr)) sr=b'\x80\x03c__main__\nAAA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00ttttq\x03X\x03\x00\x00\x00abcq\x04sb.' >>> b2 = pickle.loads(sr) >>> print(b2.tttt) abc >>> 上面例子可以看出这回保存了AAA,tttt和abc,因为这才是每一个对象每次都变化的 但是,反序列化的时候要找到AAA类的定义才能成功,否则会抛异常 可以这样理解:反序列化的时候,类是模子,二进制序列就是铁水
3、序列化的应用
五、JSON
1、Json的数据类型
2、json模块常用方法
举例: import json d = { 'name':'Tom', 'age':20, 'interest':['music','movie'] } j = json.dumps(d) print(j) d1 = json.loads(j) print(d1) 一般json编码的数据很少落地,数据都是通过网络传输,传输的时候要考虑压缩 本质上来说它就是个文本,就是个字符串,json很简单,几乎语言编程都支持json
六、MessagePack
pip install msgpack-python安装 常用方法 packb 序列化对象,提供了dumps来兼容pickle和json unpackb反序列化对象,提供了loads来兼容 pack序列化对象保存在文件对象,提供了dump来兼容 unpack反序列化对象保存到文件对象,提供了load来兼容 import mspack d = { 'name':'Tom', 'age':20, 'interest':['music','movie'] } b = msgpack.packb(d) print(len(b)) print(b) d1 = msgpack.unpackb(b) print(d1) d1 = msgpack.unpackb(b,encoding='utf-8') print(d1)优质内容筛选与推荐>>