marshal—内部 Python 对象序列化


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

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

Warning

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

并非所有 Python 对象类型都受支持;通常,此模块只能写入和读取其值与特定的 Python 调用无关的对象。支持以下类型:布尔值,整数,浮点数,复数,字符串,字节,字节数组,Tuples,列表,集合,frozenset,字典和代码对象,应理解为 Tuples,列表,集合,frozenset 仅支持字典和字典,只要其中包含的值本身受支持即可。单例NoneEllipsisStopIteration也可以编组和解组。对于小于 3 的* version *格式,不能编写递归列表,集合和词典(请参见下文)。

有些Function可以读写文件,也可以对类似字节的对象进行操作。

该模块定义了以下Function:

  • marshal. dump(* value file * [,* version *])
    • 将值写在打开的文件上。该值必须是受支持的类型。该文件必须是可写的binary file

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

  • version *参数指示dump应该使用的数据格式(请参见下文)。
  • marshal. load(* file *)
    • 从打开的文件中读取一个值,然后将其返回。如果未读取有效值(例如,因为数据具有不同的 Python 版本的不兼容封送格式),请提高EOFErrorValueErrorTypeError。该文件必须是可读的binary file

Note

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

  • marshal. dumps(* value * [,* version *])
    • 返回将由dump(value, file)写入文件的 bytes 对象。该值必须是受支持的类型。如果 value 具有(或包含具有不支持的类型的)对象,则引发ValueError异常。
  • version *参数指示dumps应该使用的数据格式(请参见下文)。

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

  • marshal. version
    • 指示模块使用的格式。版本 0 是历史格式,版本 1 共享实习字符串,而版本 2 使用二进制格式表示浮点数。版本 3 增加了对对象实例化和递归的支持。当前版本是 4.

Footnotes

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