数据编组支持

这些例程允许 C 代码使用与marshal模块相同的数据格式来处理序列化对象。有一些Function可将数据写入序列化格式,还有一些附加Function可用于读回数据。必须以二进制模式打开用于存储编组数据的文件。

数值先存储最低有效字节。

该模块支持两种版本的数据格式:版本0是历史版本,版本1(Python 2.4 中的新增Function)共享文件中的内联字符串,以及在解组后。版本 2(Python 2.5 中的新增Function)对浮点数使用二进制格式。 * Py_MARSHAL_VERSION *表示当前文件格式(当前为 2)。

  • 无效PyMarshal_WriteLongToFile(long * value *,FILE ** file *,int * version *)
    • long整数* value 编组为 file 。这只会写入 value *的最低有效 32 位;不论原生long类型的大小如何。

在版本 2.4 中更改:版本表示文件格式。

  • void PyMarshal_WriteObjectToFile(PyObject *value ,FILE file *,int * version *)
    • 将 Python 对象* value 编组为 file *。

在版本 2.4 中更改:版本表示文件格式。

  • PyObject * PyMarshal_WriteObjectToString(PyObject ** value *,int * version *)
    • 返回值:新参考.

返回包含* value *的编组表示形式的字符串对象。

在版本 2.4 中更改:版本表示文件格式。

以下Function允许读回编组的值。

XXX 错误检测如何?似乎读取超过文件末尾的值将始终导致负数值(与之相关),但是尚不清楚在没有错误的情况下负值将无法正确处理。正确的说法是什么?应该使用这些例程仅写入非负值吗?

  • PyMarshal_ReadLongFromFile(FILE ** file *)

    • 从打开的FILE*数据流中返回 C long。不管long的原始大小如何,使用此函数只能读取 32 位值。
  • int PyMarshal_ReadShortFromFile(FILE ** file *)

    • 从打开的FILE*数据流中返回 C short。不论short的原始大小如何,使用此函数只能读取 16 位值。
  • PyObject * PyMarshal_ReadObjectFromFile(FILE ** file *)

    • 返回值:新参考.

从打开的FILE*中读取数据流中的 Python 对象。出错时,设置适当的异常(EOFErrorTypeError)并返回* NULL *。

  • PyObject * PyMarshal_ReadLastObjectFromFile(FILE ** file *)
    • 返回值:新参考.

从打开的FILE*中读取数据流中的 Python 对象。与PyMarshal_ReadObjectFromFile()不同,此函数假定不会再从文件中读取任何对象,从而使其能够将文件数据积极地加载到内存中,以便反序列化可以从内存中的数据进行操作,而不是一次从文件中读取一个字节。仅当您确定不会从文件中读取其他内容时,才使用这些变体。出错时,设置适当的异常(EOFErrorTypeError)并返回* NULL *。

  • PyObject * PyMarshal_ReadObjectFromString(char ** string *,Py_ssize_t * len *)
    • 返回值:新参考.

从数据流中的字符缓冲区返回一个 Python 对象,该字符缓冲区包含* string 指向的 len 个字节。出错时,设置适当的异常(EOFErrorTypeError)并返回 NULL *。

在版本 2.5 中更改:此函数为 len 使用int类型。这可能需要更改您的代码以正确支持 64 位系统。