序列化:
变量从内存中变成可存储或传输的过程
在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等
反序列化(unpickling):
变量内容从序列化的对象重新读到内存里
import pickle d = dict(name='Bob', age=20, score=88) pickle.dumps(d) #结果 b'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00scoreqx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.' '''pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。 或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object''' f = open('dump.txt', 'wb') pickle.dump(d, f) f.close() #反序列化,pickle.loads()/load() f = open('dump.txt', 'rb') d = pickle.load(f) f.close() d {'age': 20, 'score': 88, 'name': 'Bob'}
若在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便
JSON
Python内置的json
模块提供了非常完善的Python对象到JSON格式的转换
#str与JSON的字符串之间转换 import json d = dict(name='Bob', age=20, score=88) json.dumps(d) #方法返回一个str '{"age": 20, "score": 88, "name": "Bob #反序列化 json.loads(json_str) {'age': 20, 'score': 88, 'name': 'Bob'}
类的处理
import json d = dict(name='Bob', age=20, score=88) data = json.dumps(d) print('JSON Data is a str:', data) reborn = json.loads(data) print(reborn) class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score def __str__(self): return 'Student object (%s, %s, %s)' % (self.name, self.age, self.score) s = Student('Bob', 20, 88) std_data = json.dumps(s, default=lambda obj: obj.__dict__) print('Dump Student:', std_data) rebuild = json.loads(std_data, object_hook=lambda d: Student(d['name'], d['age'], d['score'])) print(rebuild)