序列化與JSON

      在〈序列化與JSON〉中尚無留言

何謂序列化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)

物件序列化

物件只會序列化物件變數, 類別變數則無法序列化

🔒 底下內容僅限會員閱讀。

立即登入

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *