marshal.md
1> **Источник:** https://python-all.ru/3.0/library/marshal.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `marshal` – Внутренняя сериализация объектов Python89Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [\[1\]](https://python-all.ru/3.0/library/marshal.html#id2)1011Это не универсальный модуль для долговременного сохранения. Для общего хранения и передачи объектов Python через вызовы RPC обратитесь к модулям [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle) и [`shelve`](https://python-all.ru/3.0/library/shelve.html#module-shelve). Модуль `marshal` существует в основном для поддержки чтения и записи квазискомпилированного кода для модулей Python в файлах `.pyc`. Поэтому разработчики Python оставляют за собой право изменять формат marshal способами, нарушающими обратную совместимость, если возникнет необходимость. Для сериализации и десериализации объектов Python используйте модуль [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle) – его производительность сопоставима, гарантируется независимость от версий, и pickle поддерживает значительно более широкий круг объектов, чем marshal.1213> **Предупреждение**14>15> Модуль `marshal` не предназначен для защиты от ошибочных или вредоносных данных. Никогда не распаковывайте данные, полученные из ненадёжного или неаутентифицированного источника.1617Не все типы объектов Python поддерживаются; в целом модуль может записывать и читать только те объекты, значение которых не зависит от конкретного запуска Python. Поддерживаются следующие типы: `None`, целые числа, числа с плавающей запятой, строки, байтовые строки, массивы байтов, кортежи, списки, множества, словари и объекты кода. При этом кортежи, списки и словари поддерживаются только при условии, что их содержимое тоже поддерживается; рекурсивные списки и словари записывать нельзя (они вызовут бесконечный цикл).1819Существуют функции для чтения/записи файлов, а также функции, работающие со строками.2021Модуль определяет следующие функции:2223#### `[marshal.dump]marshal.dump(value, file[, version])`2425Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, таким как `sys.stdout` или возвращённым [`open()`](https://python-all.ru/3.0/library/functions.html#open) или `os.popen()`. Он должен быть открыт в бинарном режиме (`'wb'` или `'w+b'`).2627Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возбуждается исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) – но мусорные данные всё равно будут записаны в файл. Объект не будет корректно прочитан обратно с помощью [`load()`](https://python-all.ru/3.0/library/marshal.html#marshal.load).2829Аргумент *version* указывает формат данных, который должна использовать `dump` (см. ниже).3031#### `[marshal.load]marshal.load(file)`3233Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимости формата marshal другой версии Python), возбуждает [`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError), [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) или [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). Файл должен быть открытым файловым объектом, открытым в бинарном режиме (`'rb'` или `'r+b'`).3435> **Предупреждение**36>37> Если объект, содержащий неподдерживаемый тип, был упакован с помощью [`dump()`](https://python-all.ru/3.0/library/marshal.html#marshal.dump), то [`load()`](https://python-all.ru/3.0/library/marshal.html#marshal.load) подставит `None` вместо нераспаковываемого типа.3839#### `[marshal.dumps]marshal.dumps(value[, version])`4041Возвращает строку, которая была бы записана в файл функцией `dump(value, file)`. Значение должно быть поддерживаемого типа. Возбуждает исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.4243Аргумент *version* указывает формат данных, который должна использовать `dumps` (см. ниже).4445#### `[marshal.loads]marshal.loads(string)`4647Преобразует строку в значение. Если корректное значение не найдено, возбуждает4849[`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError)5051,5253[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)5455или5657[`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)5859. Лишние символы в строке игнорируются.6061Кроме того, определены следующие константы:6263#### `[marshal.version]marshal.version`6465Указывает формат, используемый модулем. Версия 0 – это исторический формат, версия 1 использует интернированные строки, а версия 2 – двоичный формат для чисел с плавающей точкой. Текущая версия – 2.6667Сноски6869| [\[1\]](https://python-all.ru/3.0/library/marshal.html#id1) | Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс. |70| --- | --- |71