序列化(Serialization)是将对象的信息转换为可以存储或传输的形式,后续还可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
在python中也可以进行序列化相关的操作,只是序列化的时候需要将对象保存为一个字典的类型。对于Python内置的数据类型(如str,unicode,int,float,bool,None,list,tuple,dict),可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。
实验步骤:
1.将对象序列化为字典
2.读取字典信息并反序列化为对象
A.导入模块
B.找到模块下的某个类
C.通过类名获得类对象,注意:不是类名称,而是类对象
D.通过类对象,实例化一个对象
tmp.py
--------------------------------------------------------------------------------------
class T:
def __init__(self,name,age):
self.name=name
self.age=age
tmp2.py
--------------------------------------------------------------------------------------
#第一种写法,将对象转化为字典
def obj2dict(obj):
#定义一个空白的字典,此处没有使用d={}方式,因为PyCharm会产生警告
d=dict()
#写入模块和类名,用于反射
d['class_name']=obj.__class__.__name__
d['module_name']=obj.__module__
#将对象返回的字典(只包括字段)和类信息连接为一个新的字典
d.update(obj.__dict__)
return d
#第二种写法,将对象转化为字典
def obj2dict(obj):
new_dict=obj.__dict__
new_dict['class_name']=obj.__class__.__name__
new_dict['module_name']=obj.__module__
return new_dict
def dict2obj(dic):
if'class_name'in dic:
info="【\n"+"\t接收字典:"+str(dic)+"\n"
#获取类名称和模块名称,并弹出
class_name=dic.pop('class_name')
module_name=dic.pop('module_name')
info+="\t类名称为:"+str(class_name)+"\n"\
+"\t模块名称:"+str(module_name)+"\n"
#导入模块,返回已经导入的“模块对象”
#fromlist代表多级导入(否则只能导入到目录级别)
module_obj=__import__(module_name,
fromlist=["True"])
info+="\t模块对象:"+str(module_obj)+"\n"
#通过“类名称”返回“类对象”
#第一个参数必需传已经导入的“模块对象”,不能传“模块名称”
class_obj=getattr(module_obj,class_name)
info+="\t类对象为:"+str(class_obj)+"\n"\
+"\t构造参数:"+str(dic)+"\n"+"】"
print(info)
#反射实例化一个对象
instance=class_obj(**dic)
else:
instance=dic
return instance
tmp3.py
--------------------------------------------------------------------------------------
from TestTemp.tmp import T
from TestTemp.tmp2 import*
if __name__=="__main__":
t=T("Jonah",12)
dic=obj2dict(t)#对象转字典
ob=dict2obj(dic)#字典转对象
print(ob)
print(ob.__dict__)
运行结果:
【 接收字典:{'class_name':'T','module_name':'TestTemp.tmp',
'name':'Jonah','age':12}
类名称为:T
模块名称:TestTemp.tmp
模块对象:<module'TestTemp.tmp'
from'D:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py'>
类对象为:<class'TestTemp.tmp.T'>
构造参数:{'name':'Jonah','age':12}
】
<TestTemp.tmp.T object at 0x00000000025EF630>
{'name':'Jonah','age':12}
领取专属 10元无门槛券
私享最新 技术干货