marshal内部Python对象序列化(3)pickle和marshal模块永久存储Python数据(必读进阶Python教程)(参考资料)
该模块包含可以二进制格式读写Python值的函数。该格式特定于Python,但与机器架构问题无关(例如,您可以将Python值写入PC上的文件,将文件传输到Sun,然后将其读回)。格式细节有意无证; 它可能会在Python版本之间发生变化(虽然它很少)。[1]
这不是一般的“持久性”模块。有关通过RPC调用的Python对象的一般持久性和传输,请参阅模块pickle
和shelve
。该marshal
模块主要用于支持读取和编写Python模块.pyc
文件的“伪编译”代码。因此,Python维护者保留在需要时以向后不兼容的方式修改编组格式的权利。如果您正在对Python对象进行序列化和反序列化,请使用该pickle
模块 – 性能可比,版本独立性得到保证,并且pickle支持比marshal更广泛的对象。
警告
该marshal
模块不是为了防止错误或恶意构造的数据。永远不要从不受信任或未经身份验证的来源解组数据。
并非所有Python对象类型都受支持; 通常,此模块只能编写和读取其值独立于Python的特定调用的对象。支持以下类型:布尔值,整数,浮点数,复数,字符串,字节,字节数组,元组,列表,集合,frozensets,字典和代码对象,其中应该理解元组,列表,集合,frozensets只有支持其中包含的值,才支持字典和字典。在单身None
,Ellipsis
并且StopIteration
还可以编组和解组。对于低于3的格式版本,无法编写递归列表,集合和词典(请参见下文)。
有些函数可以读/写文件以及在类字节对象上运行的函数。
该模块定义了这些功能:
marshal.
dump
(值,文件[,版本] )- 将值写在打开的文件上。该值必须是受支持的类型。该文件必须是可写的二进制文件。
如果该值具有(或包含具有不支持类型的对象),
ValueError
则会引发异常 – 但也会将垃圾数据写入该文件。该对象将无法正确读回load()
。该版本的说法表示数据格式
dump
应使用(见下文)。
marshal.
load
(文件)- 从打开的文件中读取一个值并将其返回。如果没有有效的读取值(例如,因为数据有不同的Python版本的不兼容元帅格式),提高
EOFError
,ValueError
或TypeError
。该文件必须是可读的二进制文件。注意
如果编组了包含不受支持类型的对象
dump()
,load()
则将替换None
unmarshallable类型。
marshal.
dumps
(值[,版本] )- 返回将写入文件的bytes对象。该值必须是受支持的类型。养异常,如果值具有(或包含具有的对象)不支持的类型。
dump(value, file)
ValueError
该版本的说法表示数据格式
dumps
应使用(见下文)。
marshal.
loads
(字节)- 将类字节对象转换为值。如果没有找到有效的价值,提高
EOFError
,ValueError
或TypeError
。输入中的额外字节将被忽略。
此外,还定义了以下常量:
marshal.
version
- 指示模块使用的格式。版本0是历史格式,版本1共享内部字符串,版本2使用二进制格式表示浮点数。版本3增加了对对象实例化和递归的支持。目前的版本是4。
脚注
[1] | 这个模块的名称源于Modula-3(以及其他)的设计者使用的一些术语,他们使用术语“编组”以自包含的形式传送数据。严格来说,“编组”意味着将一些数据从内部转换为外部形式(例如在RPC缓冲区中),并将“解组”转换为反向过程。 |