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


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

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

警告

marshal 模塊對(duì)于錯(cuò)誤或惡意構(gòu)建的數(shù)據(jù)來(lái)說(shuō)是不安全的。 永遠(yuǎn)不要 unmarshal 來(lái)自不受信任的或未經(jīng)驗(yàn)證的來(lái)源的數(shù)據(jù)。

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

有些函數(shù)可以讀/寫(xiě)文件,還有些函數(shù)可以操作字節(jié)類(lèi)對(duì)象。

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

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

向打開(kāi)的文件寫(xiě)入值。 值必須為受支持的類(lèi)型。 文件必須為可寫(xiě)的 binary file

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

version 參數(shù)指明 dump 應(yīng)當(dāng)使用的數(shù)據(jù)格式(見(jiàn)下文)。

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

marshal.load(file)?

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

引發(fā)一個(gè) 審計(jì)事件 marshal.load,沒(méi)有附帶參數(shù)。

備注

如果通過(guò) dump() marshal 了一個(gè)包含不受支持類(lèi)型的對(duì)象,load() 將為不可 marshal 的類(lèi)型替換 None。

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

marshal.dumps(value[, version])?

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

version 參數(shù)指明 dumps 應(yīng)當(dāng)使用的數(shù)據(jù)類(lèi)型(見(jiàn)下文)。

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

marshal.loads(bytes)?

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

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

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

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

marshal.version?

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

備注

1

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