> **Источник:** https://python-all.ru/3.7/c-api/marshal.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Поддержка маршалинга данных

Эти процедуры позволяют коду на C работать с сериализованными объектами, используя тот же формат данных, что и модуль [`marshal`](https://python-all.ru/3.7/library/marshal.html#module-marshal). Есть функции для записи данных в формат сериализации и дополнительные функции для чтения данных обратно. Файлы, используемые для хранения маршалированных данных, должны быть открыты в двоичном режиме.

Числовые значения хранятся с младшим байтом первым.

Модуль поддерживает две версии формата данных: версия 0 – это историческая версия, версия 1 использует интернированные строки в файле и при демаршалинге. Версия 2 использует двоичный формат для чисел с плавающей точкой. `Py_MARSHAL_VERSION` указывает текущий формат файла (сейчас 2).

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

Маршалирует целое число `long`, *value*, в *file*. Будет записано только младшие 32 бита *value*; независимо от размера родного типа `long`. *version* указывает формат файла.

Эта функция может завершиться ошибкой, и в этом случае она устанавливает индикатор ошибки. Используйте [`PyErr_Occurred()`](https://python-all.ru/3.7/c-api/exceptions.html#c.PyErr_Occurred) для проверки.

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

Маршалирует объект Python, *value*, в *file*. *version* указывает формат файла.

Эта функция может завершиться ошибкой, и в этом случае она устанавливает индикатор ошибки. Используйте [`PyErr_Occurred()`](https://python-all.ru/3.7/c-api/exceptions.html#c.PyErr_Occurred) для проверки.

#### `PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version)`

*Возвращаемое значение: новая ссылка.*

Возвращает объект bytes, содержащий маршалированное представление *value*. *version* указывает формат файла.

Следующие функции позволяют считывать маршалированные значения обратно.

#### `long PyMarshal_ReadLongFromFile(FILE *file)`

Возвращает C `long` из потока данных в `FILE*`, открытом для чтения. С помощью этой функции можно прочитать только 32-битное значение, независимо от родного размера `long`.

В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.7/library/exceptions.html#EOFError)) и возвращает `-1`.

#### `int PyMarshal_ReadShortFromFile(FILE *file)`

Возвращает C `short` из потока данных в `FILE*`, открытом для чтения. С помощью этой функции можно прочитать только 16-битное значение, независимо от родного размера `short`.

В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.7/library/exceptions.html#EOFError)) и возвращает `-1`.

#### `PyObject* PyMarshal_ReadObjectFromFile(FILE *file)`

*Возвращаемое значение: новая ссылка.*

Возвращает объект Python из потока данных в `FILE*`, открытом для чтения.

В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.7/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError)) и возвращает `NULL`.

#### `PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)`

*Возвращаемое значение: новая ссылка.*

Возвращает объект Python из потока данных в `FILE*`, открытом для чтения. В отличие от [`PyMarshal_ReadObjectFromFile()`](https://python-all.ru/3.7/c-api/marshal.html#c.PyMarshal_ReadObjectFromFile), эта функция предполагает, что из файла больше не будет прочитано объектов, что позволяет ей агрессивно загружать данные файла в память, чтобы десериализация могла работать с данными в памяти, а не читать по байту из файла. Используйте этот вариант, только если вы уверены, что больше не будете читать ничего другого из файла.

В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.7/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError)) и возвращает `NULL`.

#### `PyObject* PyMarshal_ReadObjectFromString(const char *data, Py_ssize_t len)`

*Возвращаемое значение: новая ссылка.*

Возвращает объект Python из потока данных в байтовом буфере, содержащем *len* байт, на которые указывает *data*.

В случае ошибки устанавливает соответствующее исключение ([`EOFError`](https://python-all.ru/3.7/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError)) и возвращает `NULL`.
