序列化:把变量从内存中变成可存储或传输的过程,在Python中叫pickling,在其他语言中也被称serialization,marshalling,flattening等等
反序列化:把变量内容从序列化的对象重新读到内存里
pcikel模块实现序列化
函数介绍:
pickel.dumps() 将一个对象序列化为一个bytes
pickle.dump() 直接吧对象序列花并写入一个file-like object
pickle.loads() 将bytes反序列化为一个对象
pickle.load() 直接从一个file-like object反序列化出对象
简单代码实例
#pickle模块的序列化,pickle序列化时是得到一个bytes
import pickle
d = dict(name='duan',age=45)
#利用pickle.dumps并写入文件
b = pickle.dumps(d) #序列化为bytes
f = open('se.txt','wb')
f.write(b)
f.close()
#利用pickle.dump直接吸入一个file-like object
f = open('se.txt','wb')
pickel.dump(d,f)
f.close()
#反序列化,利用pickle.loads
f = open('se.txt','rb')
bs = f.read()
print(pickle.loads(bs))
f.close()
#反序列化,利用pickle.load直接反序列化一个file-like object
f = open('se.txt','rb')
print(pickle.load(f))
f.close()
json模块实现序列化和反序列化
json和python内置数据类型对应关系:
JSON类型 Python类型
{} dict
[] list
“string” str
1234.56 int或float
true/false True/False
null None
函数介绍:
json.dumps() 将一个对象序列化为一个str
json.dump() 直接吧对象序列花并写入一个file-like object
json.loads() 将json str反序列化为一个对象
json.load() 直接从一个file-like object反序列化出对象
简单代码实例
说明:
实例中包括dict的序列化反序列化和class实例的序列化和反序列化;
对于class实例在序列化时需要传入default参数,用来实现class实例和dict的转化,此处因为所有实例都有一个dict属性,所以可以用lambda表达式如下,序列化的过程为先吧class实例转化为dict,再序列化;
在反序列化时需要先序列化为dict,再用object_hook参数传入的转化函数将dict转化为class实例。
#json序列化,json序列化为一个str
import json
d = dict(name='bob',age =23)
#利用json.dumps序列化并写入一个文件
f = open('json.txt','w')
jt = json.dumps(d)
f.write(jt)
f.close()
#利用json.dump直接序列化写入一个file-like object
f = open('json.txt','w')
json.dump(d,f)
#利用json.loads()反序列化得到一个dict
f = open('json.txt','r')
print(json.loads(f.read()))
f.close()
#利用json.load()直接反序列化一个file-like object
f = open('json.txt','r')
print(json.load(f))
f.close()
#实现class实例的序列化和反序列
import json
class Student(object):
def __init(self,name,age):
self.name = name
self.age = age
#在实现序列化时我们需要定义一个转化函数,将class实例转化为dict在序列化
def student2dict(obj):
return {
'name':obj.name,
'age':obj.age
}
#在反序列化先反序列化为一个dict,同时我们也需要一个函数,将dict转化为class实例
def dict2student(di):
reutrn Student(di['name'],di['age'])
#序列化
s = Student('bob',23)
print(json.dumps(s,default=student2dict))
#对于序列化时的转化函数,由于class实例都有一个__dict__属性,记录实例变量故
print(json.dumps(s,defailt= lambda obj:obj.__dict__))
#反序列化
json_str='{"name":"bob","age":23}'
print(json.loads(json_str,object_hook=dict2student))