Документация Python неофициальный перевод

12.4. marshal – Внутренняя сериализация объектов Pythonmarshal – Internal Python object serialization

Этот модуль содержит функции для чтения и записи значений Python в двоичном формате. Формат специфичен для Python, но не зависит от архитектуры машины (например, можно записать значение Python в файл на ПК, перенести файл на Sun и прочитать его там). Детали формата намеренно не документированы; он может меняться между версиями Python (хотя это случается редко). [1]

Это не универсальный «модуль для сохранения данных». Для обычного сохранения и передачи объектов Python через вызовы RPC используйте модули pickle и shelve. Модуль marshal существует в основном для поддержки чтения и записи «псевдокомпилированного» кода модулей Python в файлы .pyc. Поэтому разработчики Python оставляют за собой право изменять формат marshal несовместимым с предыдущими версиями образом, если возникнет необходимость. Если вы сериализуете и десериализуете объекты Python, используйте вместо этого модуль pickle – производительность сопоставима, гарантируется независимость от версии, и pickle поддерживает значительно более широкий диапазон объектов, чем marshal.

Предупреждение

Модуль marshal не предназначен для защиты от ошибочных или вредоносных данных. Не распаковывайте данные, полученные из ненадёжного или неаутентифицированного источника.

Поддерживаются не все типы объектов Python; в целом, записывать и читать этим модулем можно только объекты, значение которых не зависит от конкретного запуска Python. Поддерживаются следующие типы: булевы значения, целые числа, числа с плавающей запятой, комплексные числа, строки, байты, массивы байтов (bytearray), кортежи, списки, множества, неизменяемые множества (frozenset), словари и объекты кода; при этом следует понимать, что кортежи, списки, множества, неизменяемые множества (frozenset) и словари поддерживаются только в том случае, если содержащиеся в них значения также поддерживаются. Синглтоны None, Ellipsis и StopIteration также могут быть упакованы и распакованы. Для формата version ниже 3 рекурсивные списки, множества и словари не могут быть записаны (см. ниже).

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

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

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

Записывает значение в открытый файл. Значение должно быть поддерживаемого типа. Файл должен быть открытым файловым объектом, например sys.stdout или возвращённым open() или os.popen(). Он должен быть открыт в бинарном режиме ('wb' или 'w+b').

Если значение имеет (или содержит объект, который имеет) неподдерживаемый тип, возбуждается исключение ValueError – но мусорные данные всё равно будут записаны в файл. Объект не будет корректно прочитан обратно с помощью load().

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

marshal.load(file)

Читает одно значение из открытого файла и возвращает его. Если не удаётся прочитать корректное значение (например, из-за несовместимости формата marshal другой версии Python), возбуждает EOFError, ValueError или TypeError. Файл должен быть открытым файловым объектом, открытым в бинарном режиме ('rb' или 'r+b').

Примечание

Если объект, содержащий неподдерживаемый тип, был упакован с помощью dump(), то load() подставит None вместо нераспаковываемого типа.

marshal.dumps(value[, version])

Возвращает строку, которая была бы записана в файл функцией dump(value, file). Значение должно быть поддерживаемого типа. Возбуждает исключение ValueError, если значение имеет (или содержит объект, который имеет) неподдерживаемый тип.

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

marshal.loads(string)

Преобразует строку в значение. Если корректное значение не найдено, возбуждает EOFError, ValueError или TypeError. Лишние символы в строке игнорируются.

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

marshal.version

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

Сноски

[1]Название этого модуля происходит от терминологии, используемой разработчиками Modula-3 (среди прочих), которые используют термин «marshalling» для передачи данных в самодостаточной форме. Строго говоря, «to marshal» означает преобразование некоторых данных из внутреннего представления во внешнее (например, в буфере RPC), а «unmarshalling» – обратный процесс.