序列化和反序列化
Posted rivendare
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化和反序列化相关的知识,希望对你有一定的参考价值。
序列化
- 将内存中对象存储下来,把他变成一个个字节
反序列化
- 将文件的一个个字节恢复成内存对象
pickle库
- dumps 对象序列化为bytes对象
- dump 对象序列化到文件对象,存入文件
- loads 从bytes对象反序列化
- load 对象反序列化,从文件读取数据
示例:
import pickle filename = ‘test.txt‘ d = {‘a‘:1,‘b‘:‘qwe‘,‘c‘:[1,2,3]} l = list(‘123‘) i = 99 with open(filename,‘wb‘) as f: #序列化 pickle.dump(d,f) pickle.dump(l,f) pickle.dump(i,f) with open(filename,‘rb‘) as f: #反序列化 print(f.read(),f.seek(0)) for _ in range(3): x = pickle.load(f) print(type(x),x)
输出为:
b‘x80x03}qx00(Xx01x00x00x00aqx01Kx01Xx01x00x00x00bqx02Xx03x00x00x00qweqx03Xx01x00x00x00cqx04]qx05(Kx01Kx02Kx03eu.x80x03]qx00(Xx01x00x00x001qx01Xx01x00x00x002qx02Xx01x00x00x003qx03e.x80x03Kc.‘ 0 <class ‘dict‘> {‘a‘: 1, ‘b‘: ‘qwe‘, ‘c‘: [1, 2, 3]} <class ‘list‘> [‘1‘, ‘2‘, ‘3‘] <class ‘int‘> 99
示例:
import pickle class AA: tttt = ‘abc‘ def show(self): print(‘def‘) a1 = AA() sr = pickle.dumps(a1) print(‘sr={}‘.format(sr)) #AA a2 = pickle.loads(sr) print(a2.tttt) a2.show()
输出为:
sr=b‘x80x03c__main__ AA qx00)x81qx01.‘ abc def
以上只序列化了一个AA类名,反序列化的时候找到类就可以恢复一个对象
序列化应用
本地序列化的情况应用较少,大多场景应用在网络传输中
将数据序列化后通过网络传输到远程节点,远程服务器上的服务奖接收到的数据反序列化后就可以使用
需要注意,远程接收端,反序列化时必须有对应的数据类型,否则会报错,尤其是自定义类,必须远程有一致定义
现在大多数项目需要通过网络将数据传送到其他节点,这就需要大量的序列化,反序列化过程
python程序之间可以使用pickle解决序列化,反序列化,如果跨平台,跨语言,跨协议pickle就不适用了
不同的协议,效率不同,适用场景不同,要根据不同情况分析选择
json
json是一个轻量级的数据交换格式,他基于ecmascript的一个子集,采用完全独立于变成语言的文本格式来存储和表示数据
示例:
{ "person":[ { "name":"tom", "aeg":18 }, { "name": "jerry", "aeg": 18 } ], "total": 2 }
json模块
python与json
常用方法
示例:
import json d = {‘name‘:‘tom‘,‘age‘:20,‘interest‘:[‘music‘,‘movie‘]} j = json.dumps(d) print(j,type(j)) d1 = json.loads(j) print(d1)
以上是关于序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章