# 序列化
## pickle
把變量從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等
把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling
```python
import pickle
# pickling
d = dict(name='Bob', age=20, score=88)
pickle.dumps(d) # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KXu.'
f = open('dump.txt', 'wb')
pickle.dump(d, f) # 寫進文件
f.close()
# unpickling
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
d # {'name': 'Bob', 'age': 20, 'score': 88}
```
## JSON
```python
import json
d = dict(name='Bob', age=20, score=88)
json.loads(json.dumps(d)) # {'name': 'Bob', 'age': 20, 'score': 88}
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
json_str = json.dumps(s, default=lambda obj: obj.__dict__) # 因為通常class的實例都有一個__dict__屬性,它就是一個dict,用來存儲實例變量。所以我們可以偷個懶,把任意class的實例變為dict
# 反json
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
print(json.loads(json_str, object_hook=dict2student))
```