11.5. marshal-内部 Python 对象序列化

该模块包含可以以二进制格式读取和写入 Python 值的函数。该格式专用于 Python,但与计算机体系结构问题无关(例如,您可以将 Python 值写入 PC 上的文件,将文件传输到 Sun,然后在此处读取)。该格式的详细信息未有意记录在案;它可能会在 Python 版本之间发生变化(尽管很少会发生变化)。 [1]

这不是通用的“持久性”模块。有关pass RPC 调用进行 Python 对象的一般持久性和传输的信息,请参见模块pickleshelvemarshal模块主要用于支持读写.pyc文件的 Python 模块的“伪编译”代码。因此,如果需要,Python 维护者保留以向后不兼容的方式修改封送格式的权利。如果您要对 Python 对象进行序列化和反序列化,请改用pickle模块-性能可比,可以保证版本独立性,并且 pickle 支持的对象范围远超过编组。

Warning

marshal模块并非旨在防止错误或恶意构建的数据。切勿对从不可信或未经身份验证的来源收到的数据进行封送处理。

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

Warning

在 C 的long int类型具有超过 32 位的机器上(例如 DEC Alpha),可以创建长于 32 位的纯 Python 整数。如果将这样的整数编组并在 C 的long int类型只有 32 位的计算机上读回,则会返回 Python 长整数对象。当类型不同时,数值相同。 (此行为是 Python 2.2 中的新Function.在较早的版本中,该值中除最低有效的 32 位之外的所有位都丢失了,并显示警告消息.)

有一些读/写文件的Function以及对字符串进行操作的Function。

该模块定义了以下Function:

  • marshal. dump(* value file * [,* version *])
    • 将值写在打开的文件上。该值必须是受支持的类型。该文件必须是打开的文件对象,例如sys.stdout或由open()os.popen()返回。它可能不是 Windows 上的包装,例如 TemporaryFile。它必须以二进制模式('wb''w+b')打开。

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

2.4 版中的新增Function:* version *参数指示dump应该使用的数据格式(请参见下文)。

  • marshal. load(* file *)
    • 从打开的文件中读取一个值,然后将其返回。如果未读取有效值(例如,因为数据具有不同的 Python 版本的不兼容封送格式),请提高EOFErrorValueErrorTypeError。该文件必须是以二进制模式('rb''r+b')打开的打开文件对象。

Note

如果包含不支持类型的对象已使用dump()编组,则load()将用None代替不可编组的类型。

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

2.4 版中的新增Function:* version *参数指示dumps应该使用的数据格式(请参见下文)。

  • marshal. loads(* string *)
    • 将字符串转换为值。如果找不到有效值,请提高EOFErrorValueErrorTypeError。字符串中的多余字符将被忽略。

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

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

2.4 版的新Function。

Footnotes

  • [1]
    • 该模块的名称源于 Modula-3 的设计人员(除其他外)使用的一些术语,他们使用术语“编组”以自包含的形式传送数据。严格来说,“封送”是指将某些数据从内部格式转换为外部格式(例如,在 RPC 缓冲区中),并进行“反编组”以进行反向处理。