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
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP