什么是序列化
程序运行时所有的变量在内存中,在运行时如果没有把变量变成可存储的对象的话,程序结束后下次运行,变量依然没有改到。所以我们需要序列化这个过程来帮助我们把运行程序时修改的变量存储起来。简单得说,序列化就是把变量从内存中变成可存储或可传输的过程。当然了有序列化就有反序列化,反序列化是把变量内容从序列化的对象重新读到内存里。
python的序列化
python 中有两种方式实现序列化,pickle
模块和json
模块。
pickle实现序列化
序列成一个bytes类型数据
pickle.dumps()
和pickle.loads()
import pickle
dict_t = dict(name='张三',age=18,sex='man')
print(dict_t)
# 序列化成一个bytes,然后写入文件
pdump = pickle.dumps(dict_t)
print(pdump)
with open('pickledumps.txt','wb') as f:
f.write(pdump)
# 读取文件并反序列化文件
with open('pickledumps.txt','rb') as f:
print(pickle.loads(f.read()))
序列成一个file-like object
pickle.dump()
和pickle.load()
与上面的区别在于后面的s
。
import pickle
dict_t = dict(name='张三',age=18,sex='man')
print(dict_t)
#序列化成file-like object,直接写入文件
with open('pickledump.txt','wb') as f:
pickle.dump(dict_t,f)
#反序列化,读取数据
with open('pickledump.txt','rb') as f:
print('this is pickle file:\n',pickle.load(f))
json实现序列化
序列成一个str类型数据
import json
dict_t = dict(name='李四',age=18,sex='man')
print(dict_t)
# 序列化dumps()返回一个str,写入文件
json_d = json.dumps(dict_t)
with open('jsondumps.txt','w') as f:
f.write(json_d)
with open('jsondumps.txt','r') as f:
print(json.loads(f.read()))
序列成一个file-like object
import json
dict_t = dict(name='李四',age=18,sex='man')
print(dict_t)
# 序列化dump()返回一个file-like object,直接写入文件
with open('jsondump.txt','w') as f:
json_d = json.dump(dict_t,f)
# 反序列化load()从file-like Object中读取字符串并反序列化
with open('jsondump.txt','r') as f:
print(json.load(f))
类的序列化
我们时常用到的是类的序列化,但是类的对象不可以直接用json.dump()
序列化,但json.dump()
函数为我们提供定制功能,在函数调用时参入参数即可,参数是将类里面的数据返回成一个dict
类型。
比如可以这样写:
json.dumps(s, default=lambda obj: obj.__dict__)
反序列化也是同样的道理,可以写一个函数,将dict
转换为类实例。