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)參閱 pickle
和 shelve
等模塊。 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
,ValueError
或TypeError
。 文件必須為可讀的 binary file。引發(fā)一個(gè) 審計(jì)事件
marshal.load
,沒(méi)有附帶參數(shù)。在 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
,ValueError
或TypeError
。 輸入的額外字節(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"。