marshal --- 內(nèi)部 Python 對象序列化?


此模塊包含一此能以二進制格式來讀寫 Python 值的函數(shù)。 這種格式是 Python 專屬的,但是獨立于特定的機器架構(即你可以在一臺 PC 上寫入某個 Python 值,將文件傳到一臺 Sun 上并在那里讀取它)。 這種格式的細節(jié)有意不帶文檔說明;它可能在不同 Python 版本中發(fā)生改變(但這種情況極少發(fā)生)。 1

這不是一個通用的“持久化”模塊。 對于通用的持久化以及通過 RPC 調(diào)用傳遞 Python 對象,請參閱 pickleshelve 等模塊。 marshal 模塊主要是為了支持讀寫 .pyc 文件形式“偽編譯”代碼的 Python 模塊。 因此,Python 維護者保留在必要時以不向下兼容的方式修改 marshal 格式的權利。 如果你要序列化和反序列化 Python 對象,請改用 pickle 模塊 -- 其執(zhí)行效率相當,版本獨立性有保證,并且 pickle 還支持比 marshal 更多樣的對象類型。

警告

marshal 模塊對于錯誤或惡意構建的數(shù)據(jù)來說是不安全的。 永遠不要 unmarshal 來自不受信任的或未經(jīng)驗證的來源的數(shù)據(jù)。

不是所有 Python 對象類型都受支持;一般來說,此模塊只能寫入和讀取不依賴于特定 Python 調(diào)用的對象。 下列類型是受支持的:布爾值、整數(shù)、浮點數(shù)、復數(shù)、字符串、字節(jié)串、字節(jié)數(shù)組、元組、列表、集合、凍結集合、字典和代碼對象,需要了解的一點是元組、列表、集合、凍結集合和字典只在其所包含的值也是這些值時才受支持。 單例對象 None, Ellipsis and StopIteration 也可以被 marshal 和 unmarshal。 對于 version 低于 3 的格式,遞歸列表、集合和字典無法被寫入(見下文)。

有些函數(shù)可以讀/寫文件,還有些函數(shù)可以操作字節(jié)類對象。

這個模塊定義了以下函數(shù):

marshal.dump(value, file[, version])?

向打開的文件寫入值。 值必須為受支持的類型。 文件必須為可寫的 binary file。

如果值具有(或所包含的對象具有)不受支持的類型,則會引發(fā) ValueError --- 但是將向文件寫入垃圾數(shù)據(jù)。 對象也將不能正確地通過 load() 重新讀取。

version 參數(shù)指明 dump 應當使用的數(shù)據(jù)格式(見下文)。

引發(fā)一個 審計事件 marshal.dumps,附帶參數(shù) value, version。

marshal.load(file)?

從打開的文件讀取一個值并返回。 如果讀不到有效的值(例如由于數(shù)據(jù)為不同 Python 版本的不兼容 marshal 格式),則會引發(fā) EOFError, ValueErrorTypeError。 文件必須為可讀的 binary file。

引發(fā)一個 審計事件 marshal.load,沒有附帶參數(shù)。

備注

如果通過 dump() marshal 了一個包含不受支持類型的對象,load() 將為不可 marshal 的類型替換 None

在 3.10 版更改: 使用此調(diào)用為每個代碼對象引發(fā)一個 code.__new__ 審計事件。 現(xiàn)在它會為整個載入操作引發(fā)單個 marshal.load 事件。

marshal.dumps(value[, version])?

返回將通過 dump(value, file) 被寫入一個文件的字節(jié)串對象。 值必須屬于受支持的類型。 如果值屬于(或包含的對象屬于)不受支持的類型則會引發(fā) ValueError。

version 參數(shù)指明 dumps 應當使用的數(shù)據(jù)類型(見下文)。

引發(fā)一個 審計事件 marshal.dumps,附帶參數(shù) value, version

marshal.loads(bytes)?

bytes-like object 轉(zhuǎn)換為一個值。 如果找不到有效的值,則會引發(fā) EOFError, ValueErrorTypeError。 輸入的額外字節(jié)串會被忽略。

引發(fā)一個 審計事件 marshal.loads,附帶參數(shù) bytes。

在 3.10 版更改: 使用此調(diào)用為每個代碼對象引發(fā)一個 code.__new__ 審計事件。 現(xiàn)在它會為整個載入操作引發(fā)單個 marshal.loads 事件。

此外,還定義了以下常量:

marshal.version?

指明模塊所使用的格式。 第 0 版為歷史格式,第 1 版為共享固化的字符串,第 2 版對浮點數(shù)使用二進制格式。 第 3 版添加了對于對象實例化和遞歸的支持。 目前使用的為第 4 版。

備注

1

此模塊的名稱來源于 Modula-3 (及其他語言) 的設計者所使用的術語,他們使用術語 "marshal" 來表示以自包含的形式傳輸數(shù)據(jù)。 嚴格地說,將數(shù)據(jù)從內(nèi)部形式轉(zhuǎn)換為外部形式 (例如用于 RPC 緩沖區(qū)) 稱為 "marshal" 而其逆過程則稱為 "unmarshal"。