marshal.md
1> **Источник:** https://python-all.ru/2.7/library/marshal.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.5. [`marshal`](https://python-all.ru/2.7/library/marshal.html#module-marshal) – Внутренняя сериализация объектов Python89Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [1](https://python-all.ru/2.7/library/marshal.html#id2)1011Это не универсальный модуль «persistence». Для общего сохранения и передачи объектов Python через вызовы RPC см. модули [`pickle`](https://python-all.ru/2.7/library/pickle.html#module-pickle) и [`shelve`](https://python-all.ru/2.7/library/shelve.html#module-shelve). Модуль [`marshal`](https://python-all.ru/2.7/library/marshal.html#module-marshal) существует в основном для поддержки чтения и записи «псевдокомпилированного» кода для модулей Python в файлах `.pyc`. Поэтому разработчики Python оставляют за собой право изменять формат marshal обратно несовместимым образом, если возникнет необходимость. Если требуется сериализовать и десериализовать объекты Python, используйте вместо этого модуль [`pickle`](https://python-all.ru/2.7/library/pickle.html#module-pickle) – производительность сопоставима, гарантируется независимость от версий, а pickle поддерживает существенно более широкий набор объектов, чем marshal.1213> **Предупреждение**14>15> Модуль [`marshal`](https://python-all.ru/2.7/library/marshal.html#module-marshal) не предназначен для защиты от ошибочных или вредоносных данных. Никогда не десериализуйте данные, полученные из ненадёжного или неаутентифицированного источника.1617Поддерживаются не все типы объектов Python; в целом, этот модуль может записывать и читать только те объекты, значение которых не зависит от конкретного запуска Python. Поддерживаются следующие типы: булевы значения, целые числа, целые числа произвольной длины, числа с плавающей запятой, комплексные числа, строки, строки Unicode, кортежи, списки, множества, замороженные множества, словари и объекты кода. При этом следует понимать, что кортежи, списки, множества, замороженные множества и словари поддерживаются только при условии, что содержащиеся в них значения также поддерживаются; рекурсивные списки, множества и словари записывать не следует (они вызовут бесконечные циклы). Одиночные объекты [`None`](https://python-all.ru/2.7/library/constants.html#None), [`Ellipsis`](https://python-all.ru/2.7/library/constants.html#Ellipsis) и [`StopIteration`](https://python-all.ru/2.7/library/exceptions.html#exceptions.StopIteration) также могут быть маршалированы и демаршалированы.1819> **Предупреждение**20>21> На машинах, где тип `long int` в C имеет более 32 бит (например, DEC Alpha), можно создавать обычные целые Python длиннее 32 бит. Если такое целое число маршалировать и прочитать на машине, где тип `long int` в C имеет только 32 бита, вместо него будет возвращён объект целого числа произвольной длины (long). Хотя тип различается, числовое значение остаётся тем же. (Это поведение введено в Python 2.2. В более ранних версиях младшие 32 бита значения сохранялись, а остальные терялись, и выводилось предупреждение.)2223Существуют функции для чтения/записи файлов, а также функции, работающие со строками.2425Модуль определяет следующие функции:2627#### `marshal.dump(value, file[, version])`2829Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, например `sys.stdout` или возвращённым [`open()`](https://python-all.ru/2.7/library/functions.html#open) или [`os.popen()`](https://python-all.ru/2.7/library/os.html#os.popen). Он не может быть обёрткой, такой как TemporaryFile в Windows. Файл должен быть открыт в двоичном режиме (`'wb'` или `'w+b'`).3031Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возникает исключение [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) – но в файл также будут записаны мусорные данные. Объект не будет корректно прочитан обратно функцией [`load()`](https://python-all.ru/2.7/library/marshal.html#marshal.load).3233Новое в версии 2.4: Аргумент *version* указывает формат данных, который должна использовать `dump` (см. ниже).3435#### `marshal.load(file)`3637Читает одно значение из открытого файла и возвращает его. Если прочитать корректное значение не удаётся (например, из-за несовместимого формата маршалинга другой версии Python), возбуждается [`EOFError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.EOFError), [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) или [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Файл должен быть открытым файловым объектом, открытым в двоичном режиме (`'rb'` или `'r+b'`).3839> **Примечание**40>41> Если объект, содержащий неподдерживаемый тип, был маршализирован с помощью [`dump()`](https://python-all.ru/2.7/library/marshal.html#marshal.dump), то [`load()`](https://python-all.ru/2.7/library/marshal.html#marshal.load) подставит `None` вместо немаршализируемого типа.4243#### `marshal.dumps(value[, version])`4445Возвращает строку, которая была бы записана в файл функцией `dump(value, file)`. Значение должно быть поддерживаемого типа. Возбуждает исключение [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если значение имеет неподдерживаемый тип (или содержит объект неподдерживаемого типа).4647Новое в версии 2.4: Аргумент *version* указывает формат данных, который должна использовать `dumps` (см. ниже).4849#### `marshal.loads(string)`5051Преобразует строку в значение. Если корректное значение не найдено, возбуждается [`EOFError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.EOFError), [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) или [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Лишние символы в строке игнорируются.5253Кроме того, определены следующие константы:5455#### `marshal.version`5657Указывает формат, который использует модуль. Версия 0 – исторический формат, версия 1 (добавлена в Python 2.4) допускает интернирование строк, а версия 2 (добавлена в Python 2.5) использует двоичный формат для чисел с плавающей запятой. Текущая версия – 2.5859Новое в версии 2.4.6061Сноски6263**[1](https://python-all.ru/2.7/library/marshal.html#id1)**6465Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс.66