序列化
把变量的内容从内存中变成可存储或者可传输的过程称为序列化,反之,将序列化的内容读入内存称为反序列化。
二进制序列化
Python通过pickle
模块来实现二进制的序列化。其使用十分简单:
import pickle
d = dict(name='Bob', age=20)
f = pickle.dump(d) # 导出内容
rd = pickle.load(f) # 导入内容
JSON
要在不同的语言之间传递对象,需要把对象序列化为标准格式,例如XML。目前更为流行的格式是JSON。Python内置的json
模块提供了完善的Python对象到JSON格式的转换。其使用与pickle
相似。
import json
d = dict(name='Bob', age=20)
f = json.dump(d)
rd = json.loads(f)
Python的dict对象可以直接序列化为JSON的{}
。如果需要将其反序列化为类实例,需要定义转换方法。例如有以下类:
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
json.dump()
接受一个default
参数,接收一个转换函数,可以用来将对象转换为dict
。例如:
def student2dict(std):
return {'name': std.name, 'age': std.age, 'score': std.score}
或者还可以有个偷懒的办法:json.dump(object, default=lambda obj: obj.__dict__)
。通常类的实例都有一个__dict__
属性,用来存储实例变量,但是使用了__slots__
的类就不能使用这个办法。
在反序列化的时候,loads()
方法首先将其转换出一个dict
对象,然后再传入一个函数将其转换为我们需要的实例即可。