Python內部物件序列化 (marshal)


儘管Python標準庫中的marshal模組提供了物件序列化功能(類似於pickle模組),但它並不真正適用於通用資料持久化或透過套接字等傳輸Python物件。此模組主要由Python本身用於支援編譯版本的Python模組(.pyc檔案)的讀寫操作。marshal模組使用的資料格式在Python版本之間不相容(甚至子版本也不相容)。這就是為什麼一個版本的編譯Python指令碼(.pyc檔案)很可能無法在另一個版本上執行的原因。因此,marshal模組用於Python的內部物件序列化。

與pickle模組一樣,marshal模組也定義了load()和dump()函式,用於從檔案讀取和寫入marshaled物件。此外,loads()和dumps()函式處理marshaled物件的字串表示形式。

dumps() − 透過將Python物件進行marshal處理,返回一個類似位元組的物件。僅支援標準資料型別的物件進行marshal處理。不支援的型別會引發ValueError異常。

loads() − 此函式將類似位元組的物件轉換為相應的Python物件。如果轉換結果不是有效的Python物件,則可能會引發ValueError或TypeError異常。

以下程式碼顯示了使用dumps()進行marshal處理的Python字典物件。位元組表示形式透過loads()函式轉換回字典。

import marshal
person = {"name":"xyz", "age":22, "marks":[45,56,78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print (obj)

dump() − 此函式將支援的Python物件的位元組表示形式寫入檔案。檔案本身必須是具有寫入許可權的二進位制檔案。

load() − 此函式從二進位制檔案讀取位元組資料並將其轉換為Python物件。

如上所述,marshal模組用於處理.pyc檔案。以下示例演示瞭如何使用dump()和load()函式來處理Python的程式碼物件,這些物件用於儲存預編譯的Python模組。

該程式碼使用內建的compile()函式根據包含Python指令的源字串構建程式碼物件。

compile(source, file, mode)

file引數應為讀取程式碼的檔案。如果未從檔案讀取,則傳遞任何任意字串。

如果源包含一系列語句,則mode引數為'exec';如果只有一個表示式,則為'eval';如果包含單個互動式語句,則為'single'。

然後使用dump()函式將編譯後的程式碼物件儲存在.pyc檔案中。

import marshal
script = """
a = 10
b = 20
print ('addition = ',a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc","wb")
marshal.dump(code, f)
f.close()

要從.pyc檔案中反序列化物件,請使用load()函式。因為它返回一個程式碼物件,所以可以使用另一個內建函式exec()來執行它。

import marshal
f = open("a.pyc","rb")
data = marshal.load(f)
exec (data)

輸出將是嵌入在源字串中的程式碼塊的結果。

addition = 30

更新於:2020年6月27日

943 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告