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

11.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, могут быть записаны и прочитаны этим модулем. Поддерживаются следующие типы: логические значения, целые числа, числа с плавающей точкой, комплексные числа, строки, bytes, bytearrays, кортежи, списки, множества, frozensets, словари и объекты кода. При этом следует понимать, что кортежи, списки, множества, frozensets и словари поддерживаются только при условии, что содержащиеся в них значения сами являются поддерживаемыми; а рекурсивные списки, множества и словари записывать не следует (они приведут к бесконечным циклам). Синглтоны None, Ellipsis и StopIteration также могут быть маршализированы и разаршализированы.

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

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

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 – двоичный формат для чисел с плавающей точкой. Текущая версия – 2.

Сноски

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