# Use the faster _pickle if possible
try:from _pickle import (PickleError,PicklingError,UnpicklingError,Pickler,Unpickler,dump,dumps,load,loads)
except ImportError:Pickler, Unpickler = _Pickler, _Unpicklerdump, dumps, load, loads = _dump, _dumps, _load, _loads
数据持久化(Data Persistence):将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称,一般是指把瞬时数据(如内存中的对象)转换为持久数据永久保存到存储设备中(如磁盘)。
序列化\反序列化分类:二进制序列、文本序列
序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程,目的是使内存中的状态信息持久化便于以后恢复、
方便在网络传输以实现跨平台数据交互。
反序列化(Deserialization):将序列重新恢复成对象的过程,是序列化的逆过程
比较维度\标准库 | pickle | json |
---|---|---|
序列化方式 | 二进制序列 | 文本序列 |
人类直观可读 | 否 | 是 |
跨平台、语言、协议 | 否,Python专用 | 是 |
数据类型表示支持 | 可表示大量Python数据类型 | 只能表示Python内置类型子集,不能表示自定义的类 |
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
将 Python 对象写入已打开的二进制文件
# define a dict object
obj={"name":"Bonnie","isAGirl":True,"age":22,"hobbies":["guitar","singing","traveling"]
}
# 将obj写入已打开的二进制文件,序列化
with open("puppy_love.pkl","wb") as f:pickle.dump(obj,f,protocol=pickle.HIGHEST_PROTOCOL) # 设置为可用的最高协议
pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')
从已打开的二进制文件中读取打包后的对象,重建其中特定对象的层次结构并返回
# 从打开的二进制文件重建对象,反序列化
with open("puppy_love.pkl","rb") as f:obj_again=pickle.load(f)
print("反序列化后的对象为{}".format(obj_again))
pickle.dumps(obj, protocol=None, *, fix_imports=True)
将 obj 打包以后的对象作为bytes 类型直接返回,而不是将其写入到文件
# 将Python对象直接转为bytes类型,不写入文件
bytes_obj=pickle.dumps(obj,protocol=pickle.HIGHEST_PROTOCOL) # 设置为可用的最高协议
print("obj转换为bytes类型后为{}".format(bytes_obj))
pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
重建并返回一个对象的封存表示形式 data 的对象层级结构,bytes类型将反序列化为Python对象
# bytes类型将反序列化为Python对象
obj_origin=pickle.loads(bytes_obj)
print("bytes类型将反序列化为obj后{}".format(obj_origin))