序列化

作者 新城 日期 2017-08-31
序列化

序列化

在python运行的过程中 程序存在电脑内存中 包括所有的变量
我们可以随时可以修改变量 但是程序只要一旦运行结束 变量下次初始化自动变为原来的数值

1
2
3
#dict类型声明方式
d = dict(name='bob',age=21,score=100)
d = {'Adam': 95,'Lisa': 85,'Bart': 59}

把变量从内存中变成可存储或传输的过程称之为序列化

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上pickling

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling

Python提供了pickle模块来实现序列化

1
2
3
import pickle
d = dict(name='Bob',age=20,score=88)
print (pick.dumps(d)) #b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.

pick.dumps() 函数是将任意对象序列化转变成一个bytes,

pickle.dump()直接把对象序列化后写入一个file-like Object

序列化后可以将其写入文件 或者进行网络传输

pickle.loads() 如果读到一个bytes字节 将其反序列化

pickle.load() 如果读到file-like Object 将其反序列化

JSON

python 内置的JSON模块提供了完善的python对象转换JSON格式的转换
JSON 对应Python 中数据类型
{ } –> dict
[ ] –> list
“string” –> str
1234.45 –> int或float
true.false –> True/False
null –> None

JSON模块

1
2
3
import json
d = dict(name='Bob', age=20, score=88)
json.dumps(d) #输出 '{"age": 20, "score": 88, "name": "Bob"}'

dumps()方法返回一个str,内容就是标准的JSON。
dump()方法可以直接把JSON写入一个file-like Object。

JSON反序列号

loads()将json反序列化字符串变为dict
load()从file-like Object中读取并且反序列化

1
2
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str) # 输出{'age': 20, 'score': 88, 'name': 'Bob'}

json 进阶

python中dict 对象可以直接序列化转化为JSON { } 不过python 中使用class表示对象

1
2
3
4
5
6
7
8
9
10
import json

class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score

s = Student('Bob', 20, 88)
print(json.dumps(s))

运行代码 得到一个 TypeError
可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:

1
2
3
4
5
6
7
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
print(json.dumps(s, default=student2dict)) # 输出{"age": 20, "name": "Bob", "score": 88}

因为通常class的实例都有一个dict属性,它就是一个dict,用来存储实例变量。
print(json.dumps(s, default=lambda obj: obj.dict))

小结
python语言序列化模块式pickle,但是要序列化成标准的web要求需要使用模块JSON

json模块的dumps()和loads()函数是定义得非常好的接口的典范