1,什么是序列化:序列化就是将内存中的数据结构转换成一种中间格式存储到硬盘或者基于网络传输
2,反序列化:就是将硬盘或者网络中传过来的一种数据格式转换成内存中的数据结构
二:为什么要有序列化和反序列化
1,可以保存程序的运行状态
2,数据的跨平台交互
三: 怎么用
json
优点:
跨平台性强
缺点:只能支持/对应部分python部分的数据类型
注意点:# json格式不能识别单引号,全都是双引号
pickle
优点: 可以支持/对应python的所有数据类型
缺点:只能被python识别,不能跨平台
四:json和pickle实例
1,用json实现序列化
import json
dic={'name':'egon','age':18}
##序列化
res=json.dumps(dic)
###写入文件
with open ('aa.txt','wt',encoding='utf-8')as f:
f.write(res)
#1和2可以合作一步
# with open('db.pkl','wb') as f:
# json.dump(dic,f)
2.用json实现反序列化
import json
#从文件中读取json格式
with open(‘aa.txt','rt',encofing='utf-8')as f:
res=f.read()
####将json格式转成内存中的数据类型
json.loads(res)
#1和2可以合作一步
# with open('db.pkl','rb') as f:
# dic=json.load(f)
####同理,pickle模块也是这样是使用
3,用pickle实现序列化
import pickle
dic={'a':1,'b':2,'c':3}
# #1 序列化
# pkl=pickle.dumps(dic)
# # print(pkl,type(pkl))
# #2 写入文件
# with open('db.pkl','wb') as f:
# f.write(pkl)
#1和2可以合作一步
# with open('db.pkl','wb') as f:
# pickle.dump(dic,f)
4 pickle模块实现反序列化
import pickle
# # #1、从文件中读取pickle格式
# with open('db.pkl','rb') as f:
# pkl=f.read()
# #2、将json_str转成内存中的数据类型
# dic=pickle.loads(pkl)
# print(dic['a'])
#1和2可以合作一步
# with open('db.pkl','rb') as f:
# dic=pickle.load(f)
# print(dic['a'])
五:eval 在有些情况下也可以被用来做反序列化的工作,不过不建议使用。
因为eval本质上只是把字符串里面的表达式拿出来运行一下,当涉及到python中数据类型的关键字时,并不能成功的反序列化。
l例如:
当json文件中存储的数据是[ 1 , true , null ]
# 用json反序列化
# with open('db.json','rt',encoding='utf-8') as f:# l=json.load(f)
# print(l)
# 用eval反列化
# with open('db.json','rt',encoding='utf-8') as f:
# s=f.read() #s ='[1, true, null]'
# dic=eval(s) #eval('[1, true, null]')#这样会报错,因为python会认为true是一个变量名字而没有定义
# print(dic['name'])