序列化

把变量的内容从内存中变成可存储或者可传输的过程称为序列化,反之,将序列化的内容读入内存称为反序列化。

二进制序列化

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对象,然后再传入一个函数将其转换为我们需要的实例即可。