Поддержка маршалинга данных¶Data marshalling support
Эти процедуры позволяют коду на C работать с сериализованными объектами, используя тот же формат данных, что и модуль marshal. Есть функции для записи данных в формат сериализации и дополнительные функции для чтения данных обратно. Файлы, используемые для хранения маршалированных данных, должны быть открыты в двоичном режиме.
Числовые значения хранятся с младшим байтом первым.
Модуль поддерживает две версии формата данных: версия 0 – историческая версия, версия 1 (новая в Python 2.4) использует интернированные строки в файле и при разархивировании. Версия 2 (новая в Python 2.5) использует двоичный формат для чисел с плавающей запятой. Py_MARSHAL_VERSION указывает текущий формат файла (в настоящее время 2).
-
void
PyMarshal_WriteLongToFile(long value, FILE *file, int version)¶ Маршалирует целое число
long, value, в file. При этом записываются только младшие 32 бита value, независимо от размера нативного типаlong.Изменено в версии 2.4: version указывает формат файла.
-
void
PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)¶ Маршалирует объект Python, value, в file.
Изменено в версии 2.4: version указывает формат файла.
-
PyObject*
PyMarshal_WriteObjectToString(PyObject *value, int version)¶ - Возвращаемое значение: новая ссылка.
Возвращает строковый объект, содержащий маршалированное представление value.
Изменено в версии 2.4: version указывает формат файла.
Следующие функции позволяют считывать маршалированные значения обратно.
XXX А как насчёт обнаружения ошибок? Похоже, что чтение за концом файла всегда приводит к отрицательному числовому значению (там, где это имеет смысл), но неясно, будут ли отрицательные значения корректно обрабатываться, если ошибки нет. Как определить это правильно? Следует ли записывать только неотрицательные значения с помощью этих процедур?
-
long
PyMarshal_ReadLongFromFile(FILE *file)¶ Возвращает C
longиз потока данных вFILE*, открытом для чтения. С помощью этой функции можно прочитать только 32-битное значение, независимо от родного размераlong.
-
int
PyMarshal_ReadShortFromFile(FILE *file)¶ Возвращает C
shortиз потока данных вFILE*, открытом для чтения. С помощью этой функции можно прочитать только 16-битное значение, независимо от родного размераshort.
-
PyObject*
PyMarshal_ReadObjectFromFile(FILE *file)¶ - Возвращаемое значение: новая ссылка.
Возвращает объект Python из потока данных в
FILE*, открытом для чтения. В случае ошибки устанавливает соответствующее исключение (EOFErrorилиTypeError) и возвращает NULL.
-
PyObject*
PyMarshal_ReadLastObjectFromFile(FILE *file)¶ - Возвращаемое значение: новая ссылка.
Возвращает объект Python из потока данных в
FILE*, открытом для чтения. В отличие отPyMarshal_ReadObjectFromFile(), эта функция предполагает, что из файла больше не будет прочитано никаких объектов, что позволяет ей агрессивно загружать данные файла в память, чтобы десериализация могла работать с данными в памяти, а не читать их побайтно из файла. Используйте этот вариант, только если уверены, что из файла больше не будет ничего читаться. В случае ошибки устанавливает соответствующее исключение (EOFErrorилиTypeError) и возвращает NULL.
-
PyObject*
PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len)¶ - Возвращаемое значение: новая ссылка.
Возвращает объект Python из потока данных в символьном буфере, содержащем len байт, на которые указывает string. В случае ошибки устанавливает соответствующее исключение (
EOFErrorилиTypeError) и возвращает NULL.Изменено в версии 2.5: Эта функция использовала тип
intдля len. Это может потребовать изменений в вашем коде для корректной поддержки 64-битных систем.