This document is for an old version of Python that is no longer supported. You should upgrade and read the Python 当前稳定版本的文档.

# 数据 marshal 操作支持

这些例程允许 C 代码处理与 `marshal` 模块所用相同数据格式的序列化对象。 其中有些函数可用来将数据写入这种序列化格式，另一些函数则可用来读取并恢复数据。 用于存储 marshal 数据的文件必须以二进制模式打开。

数字值在存储时会将最低位字节放在开头。

The module supports two versions of the data format: version `0` is the historical version, version `1` (new in Python 2.4) shares interned strings in the file, and upon unmarshalling. Version 2 (new in Python 2.5) uses a binary format for floating point numbers. Py_MARSHAL_VERSION indicates the current file format (currently 2).

void `PyMarshal_WriteLongToFile`(long value, FILE *file, int version)

  Marshal a `long` integer, value, to file. This will only write the least-significant 32 bits of value; regardless of the size of the native `long` type.

  在 2.4 版更改: version indicates the file format.

void `PyMarshal_WriteObjectToFile`(PyObject *value, FILE *file, int version)

  Marshal a Python object, value, to file.

  在 2.4 版更改: version indicates the file format.

PyObject* `PyMarshal_WriteObjectToString`(PyObject *value, int version)
  Return value: New reference.

  Return a string object containing the marshalled representation of value.

  在 2.4 版更改: version indicates the file format.

以下函数允许读取并恢复存储为 marshal 格式的值。

XXX What about error detection? It appears that reading past the end of the file will always result in a negative numeric value (where that’s relevant), but it’s not clear that negative values won’t be handled properly when there’s no error. What’s the right way to tell? Should only non-negative values be written using these routines?

long `PyMarshal_ReadLongFromFile`(FILE *file)

  从打开用于读取的 `FILE*` 的对应数据流返回一个 C `long`。 使用此函数只能读取 32 位的值，无论本机 `long` 类型的长度如何。

int `PyMarshal_ReadShortFromFile`(FILE *file)

  从打开用于读取的 `FILE*` 的对应数据流返回一个 C `short`。 使用此函数只能读取 16 位的值，无论本机 `short` 的长度如何。

PyObject* `PyMarshal_ReadObjectFromFile`(FILE *file)
  Return value: New reference.

  Return a Python object from the data stream in a `FILE*` opened for reading. On error, sets the appropriate exception (`EOFError` or `TypeError`) and returns NULL.

PyObject* `PyMarshal_ReadLastObjectFromFile`(FILE *file)
  Return value: New reference.

  Return a Python object from the data stream in a `FILE*` opened for reading. Unlike `PyMarshal_ReadObjectFromFile()`, this function assumes that no further objects will be read from the file, allowing it to aggressively load file data into memory so that the de-serialization can operate from data in memory rather than reading a byte at a time from the file. Only use these variant if you are certain that you won’t be reading anything else from the file. On error, sets the appropriate exception (`EOFError` or `TypeError`) and returns NULL.

PyObject* `PyMarshal_ReadObjectFromString`(char *string, Py_ssize_t len)
  Return value: New reference.

  Return a Python object from the data stream in a character buffer containing len bytes pointed to by string. On error, sets the appropriate exception (`EOFError` or `TypeError`) and returns NULL.

  在 2.5 版更改: This function used an `int` type for len. This might require changes in your code for properly supporting 64-bit systems.