何謂序列化Serialization
假設在玩一個電腦遊戲, 一個變數 level=1 記錄著目前進行的關數. 這個變數是存在於Ram之中的.在程式運行中, 關數一直累進, 比如 level 會變更到第50關卡. 當程式關掉後, 再重新執行, 那麼關數level又再度回到1, 玩家必需從第一關開始玩, 這不會讓人訐譙嗎!!!
如果下次再度執行, 要從第51關卡開始, 那麼 level這個變數就必需保留起來. 怎麼保留呢, 當然, 最直覺的方法, 就是保留在硬碟或sdcard裏. 這種把變數存放在硬碟的動作, 稱為序列化.
Serialization是在Java中的稱呼. 在Python中, 英文是以Pickling代表序列化. Python提供 pickle模組支援序列化功能. pickle 是泡菜的意思, 現在知道為什麼本人都使用Serialization了吧.
dumps/loads
先看下面的互動模式, 字典 d 被dumps()到硬碟後, 傳回 p1的結果. 這時如果要把字典的結果抓回來, 就要使用 p2=pickle.loads(p1), 資料就會回復到p2裏。請注意,此時 p1是存在記憶体之中喔,所以在關掉程式後,下次直接下 p2=pickle.loads(p1),它就會靠妖p1沒定義啊。
>>> import pickle >>> d=dict(name='thomas', age=18) >>> p1=pickle.dumps(d) >>> d["name"]="tracy" >>> d {'name': 'tracy', 'age': 18} >>> p2=pickle.loads(p1) >>> p2 {'name': 'thomas', 'age': 18}
dump/load
dump()允許將資料寫入到指定的檔案中, 再由load()從指定的檔案讀取進來. 這比較適用於程式碼的撰寫. 寫入時, 模式設為 ‘wb’, 讀入時, 模式設為 ‘rb’. 寫入是一筆一筆寫入, 讀出也是一筆一筆讀出. 但若讀過頭了, 就會發出例外.
import pickle
name='張無忌'
d=dict(name='thomas', age=18)
with open("d:/python.pkl",'wb') as file:
pickle.dump(name, file)
pickle.dump(d, file)
with open('d:/python.pkl','rb') as file:
p=pickle.load(file)
print(p)
p = pickle.load(file)
print(p)
物件序列化
物件只會序列化物件變數, 類別變數則無法序列化
