11.5. marshal — 内部 Python 对象序列化 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/marshal
跳转至:导航、​搜索

11.5. 元帅 — 内部 Python 对象序列化

该模块包含可以以二进制格式读取和写入 Python 值的函数。 该格式特定于 Python,但与机器架构问题无关(例如,您可以将 Python 值写入 PC 上的文件,将文件传输到 Sun,然后从那里读取)。 格式的详细信息是故意没有记录的; 它可能会在 Python 版本之间发生变化(尽管很少发生)。 1

这不是一个通用的“持久性”模块。 对于通过 RPC 调用的 Python 对象的一般持久化和传输,请参阅模块 pickleshelvemarshal模块的存在主要是为了支持对.pyc文件的Python模块的“伪编译”代码的读写。 因此,Python 维护者保留在需要时以向后不兼容的方式修改 marshal 格式的权利。 如果您正在序列化和反序列化 Python 对象,请改用 pickle 模块 - 性能相当,版本独立性得到保证,并且 pickle 支持的对象范围比 marshal 大得多。

警告

marshal 模块并非旨在针对错误或恶意构建的数据提供安全保护。 切勿解组从不受信任或未经身份验证的来源收到的数据。


并非所有 Python 对象类型都受支持; 通常,该模块只能写入和读取其值与特定 Python 调用无关的对象。 支持以下类型:布尔值、整数、长整数、浮点数、复数、字符串、Unicode 对象、元组、列表、集合、冻结集、字典和代码对象,其中应理解为元组、列表、集合、frozensets 和dictionaries 仅在其中包含的值本身受支持时才受支持; 并且不应该编写递归列表、集合和字典(它们会导致无限循环)。 单例 NoneEllipsisStopIteration 也可以被编组和解组。

警告

在 C 的 long int 类型超过 32 位的机器上(例如 DEC Alpha),可以创建长度超过 32 位的纯 Python 整数。 如果这样的整数在 C 的 long int 类型只有 32 位的机器上被编组并读回,则返回 Python 长整数对象。 虽然是不同的类型,但数值是相同的。 (此行为在 Python 2.2 中是新的。 在早期版本中,除了最低有效的 32 位之外的所有值都丢失了,并打印了一条警告消息。)


有读/写文件的函数以及操作字符串的函数。

该模块定义了以下功能:

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

在打开的文件上写入值。 该值必须是受支持的类型。 该文件必须是一个打开的文件对象,例如 sys.stdout 或由 open()os.popen() 返回。 它可能不是 Windows 上的诸如 TemporaryFile 之类的包装器。 它必须以二进制模式打开('wb''w+b')。

如果该值具有(或包含具有)不受支持的类型的对象,则会引发 ValueError 异常 - 但垃圾数据也将写入文件。 load() 将无法正确读回该对象。

2.4 版新功能: version 参数指示 dump 应使用的数据格式(见下文)。

marshal.load(file)

从打开的文件中读取一个值并返回它。 如果没有读取到有效值(例如 因为数据具有不同的 Python 版本的不兼容的 marshal 格式),引发 EOFErrorValueErrorTypeError。 该文件必须是以二进制模式('rb''r+b')打开的打开文件对象。

笔记

如果包含不受支持的类型的对象使用 dump() 进行编组,则 load() 将替换 None 为不可编组的类型。

marshal.dumps(value[, version])

返回将由 dump(value, file) 写入文件的字符串。 该值必须是受支持的类型。 如果 value 具有(或包含具有)不受支持的类型,则引发 ValueError 异常。

2.4 版新功能: version 参数指示 dumps 应使用的数据格式(见下文)。

marshal.loads(string)
将字符串转换为值。 如果未找到有效值,则提高 EOFErrorValueErrorTypeError。 字符串中的额外字符将被忽略。

此外,还定义了以下常量:

marshal.version

指示模块使用的格式。 版本 0 是历史格式,版本 1(在 Python 2.4 中添加)共享内部字符串,版本 2(在 Python 2.5 中添加)使用浮点数的二进制格式。 当前版本是2。

2.4 版中的新功能。

脚注

1
该模块的名称源于 Modula-3 的设计者(以及其他人)使用的一些术语,他们使用术语“编组”来以独立的形式传送数据。 严格来说,“to marshal”意味着将一些数据从内部形式转换为外部形式(例如在 RPC 缓冲区中),并为反向过程“解组”。