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

---

# 12.4. [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) – Внутренняя сериализация объектов Python

Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [\[1\]](https://python-all.ru/3.4/library/marshal.html#id2)

Это не универсальный «модуль для сохранения данных». Для обычного сохранения и передачи объектов Python через вызовы RPC используйте модули [`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) и [`shelve`](https://python-all.ru/3.4/library/shelve.html#module-shelve). Модуль [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) существует в основном для поддержки чтения и записи «псевдокомпилированного» кода модулей Python в файлы `.pyc`. Поэтому разработчики Python оставляют за собой право изменять формат marshal несовместимым с предыдущими версиями образом, если возникнет необходимость. Если вы сериализуете и десериализуете объекты Python, используйте вместо этого модуль [`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) – производительность сопоставима, гарантируется независимость от версии, и pickle поддерживает значительно более широкий диапазон объектов, чем marshal.

> **Предупреждение**
>
> Модуль [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) не предназначен для защиты от ошибочных или вредоносных данных. Не распаковывайте данные, полученные из ненадёжного или неаутентифицированного источника.

Поддерживаются не все типы объектов Python; в целом, записывать и читать этим модулем можно только объекты, значение которых не зависит от конкретного запуска Python. Поддерживаются следующие типы: булевы значения, целые числа, числа с плавающей запятой, комплексные числа, строки, байты, массивы байтов (bytearray), кортежи, списки, множества, неизменяемые множества (frozenset), словари и объекты кода; при этом следует понимать, что кортежи, списки, множества, неизменяемые множества (frozenset) и словари поддерживаются только в том случае, если содержащиеся в них значения также поддерживаются. Синглтоны [`None`](https://python-all.ru/3.4/library/constants.html#None), [`Ellipsis`](https://python-all.ru/3.4/library/constants.html#Ellipsis) и [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration) также могут быть упакованы и распакованы. Для формата *version* ниже 3 рекурсивные списки, множества и словари не могут быть записаны (см. ниже).

Существуют функции для чтения/записи файлов, а также функции, работающие со строками.

Модуль определяет следующие функции:

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

Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, например `sys.stdout` или возвращённым [`open()`](https://python-all.ru/3.4/library/functions.html#open) или [`os.popen()`](https://python-all.ru/3.4/library/os.html#os.popen). Он должен быть открыт в бинарном режиме (`'wb'` или `'w+b'`).

Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возбуждается исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) – но мусорные данные всё равно будут записаны в файл. Объект не будет корректно прочитан обратно с помощью [`load()`](https://python-all.ru/3.4/library/marshal.html#marshal.load).

Аргумент *version* указывает формат данных, который должна использовать `dump` (см. ниже).

#### `marshal.load(file)`

Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимости формата marshal другой версии Python), возбуждает [`EOFError`](https://python-all.ru/3.4/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Файл должен быть открытым файловым объектом, открытым в бинарном режиме (`'rb'` или `'r+b'`).

> **Примечание**
>
> Если объект, содержащий неподдерживаемый тип, был упакован с помощью [`dump()`](https://python-all.ru/3.4/library/marshal.html#marshal.dump), то [`load()`](https://python-all.ru/3.4/library/marshal.html#marshal.load) подставит `None` вместо нераспаковываемого типа.

#### `marshal.dumps(value[, version])`

Возвращает строку, которая была бы записана в файл функцией `dump(value, file)`. Значение должно быть поддерживаемого типа. Возбуждает исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.

Аргумент *version* указывает формат данных, который должна использовать `dumps` (см. ниже).

#### `marshal.loads(string)`

Преобразует строку в значение. Если корректное значение не найдено, возбуждает [`EOFError`](https://python-all.ru/3.4/library/exceptions.html#EOFError), [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) или [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Лишние символы в строке игнорируются.

Кроме того, определены следующие константы:

#### `marshal.version`

Указывает формат, который использует модуль. Версия 0 – это исторический формат, версия 1 разделяет интернированные строки, а версия 2 использует двоичный формат для чисел с плавающей запятой. Версия 3 добавляет поддержку создания экземпляров объектов и рекурсии. Текущая версия – 4.

Сноски

| [\[1\]](https://python-all.ru/3.4/library/marshal.html#id1) | Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс. |
| --- | --- |
