marshal ---内部python对象序列化


此模块包含可以以二进制格式读取和写入python值的函数。该格式特定于python,但与机器体系结构问题无关(例如,您可以将python值写入PC上的文件,将该文件传输到Sun,然后再从中读取该文件)。格式的细节是故意未记录的;它可能在Python版本之间发生更改(尽管很少这样做)。 1

这不是一般的“持久性”模块。有关通过rpc调用的python对象的一般持久性和传输,请参阅模块 pickleshelve . 这个 marshal 模块的存在主要是为了支持对 .pyc 文件夹。因此,如果需要,Python维护人员保留以向后不兼容的方式修改封送格式的权利。如果要序列化和反序列化Python对象,请使用 pickle 相反,模块——性能相当,保证了版本独立性,并且pickle支持比marshal更广泛的对象范围。

警告

这个 marshal 模块的目的不是为了防止错误或恶意构造的数据。从不取消从不可信或未经身份验证的源接收的数据的标记。

并非所有的python对象类型都受支持;一般来说,只有值独立于特定的python调用的对象才能被此模块写入和读取。支持以下类型:布尔值、整数、浮点数、复数、字符串、字节、字节数组、元组、列表、集、冻结集、字典和代码对象,在这些类型中,应理解为只要其中包含的值本身为支持。单身汉 NoneEllipsisStopIteration 也可以进行编组和解编。格式化 版本 低于3,无法编写递归列表、集合和字典(请参见下文)。

有一些函数可以读/写文件,也有一些函数可以像对象一样操作字节。

模块定义了以下功能:

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

在打开的文件上写入值。值必须是受支持的类型。文件必须是可写的 binary file .

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

这个 版本 参数指示数据格式 dump 应使用(见下文)。

marshal.load(file)

从打开的文件中读取一个值并返回它。如果未读取有效值(例如,因为数据具有不同的Python版本的不兼容封送格式),则引发 EOFErrorValueErrorTypeError . 文件必须是可读的 binary file .

注解

如果包含不支持的类型的对象是用 dump()load() 将替代 None 对于不可拆分的类型。

marshal.dumps(value[, version])

返回将被写入文件的bytes对象 dump(value, file) . 值必须是受支持的类型。举起一个 ValueError 如果值具有(或包含具有)不支持的类型,则为异常。

这个 版本 参数指示数据格式 dumps 应使用(见下文)。

marshal.loads(bytes)

转换 bytes-like object 达到一个值。如果找不到有效值,则引发 EOFErrorValueErrorTypeError . 忽略输入中的多余字节。

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

marshal.version

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

脚注

1

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