Применение сериализации объектов Python

primenenie serializacii obektov python Базы данных и постоянное хранение

Сериализация может показаться сложной, когда сталкиваешься с ней впервые, но отрадно узнать, что Python скрывает все сложности преобразования объектов в строки. На самом деле интерфейсы модуля pickle чрезвычайно просты в употреблении. Например, чтобы преобразовать объект в последовательную форму, можно создать объект Pickler и вызывать его методы или использовать функции из модуля для достижения того же эффекта:

P = pickle.Pickler(file)

Создаст новый объект Pickler для вывода в последовательном виде в открытый выходной файл file.

P.dump(object)

Запишет объект object в файл/поток объекта Pickler.

pickle.dump(object, file)

То же, что два последних вызова вместе: сериализует объект object и выведет его в открытый файл file.

string = pickle.dumps(object)

Вернет объект object в сериализованном представлении, в виде строки символов.

Воссоздание объекта из строки с сериализованным представлением выполняется похожим образом; доступны простой функциональный и объектно-ориентированный интерфейсы:

U = pickle.Unpickler(file)

Создаст объект Unpickler, осуществляющий обратное преобразование сериализованной формы объекта из открытого входного файла file.

object = U.load()

Прочитает объект из файла/потока объекта Unpickler.

object = pickle.load(file)

То же, что два последних вызова вместе: восстановит объект из открытого файла.

object = pickle.loads(string)

Прочитает объект из строки символов вместо файла.

Pickler и Unpickler — это экспортируемые классы. Во всех этих вызовах аргумент file является либо объектом открытого файла, либо любым объектом, в котором реализованы те же атрибуты, что и у объектов файла:

     Объект Pickler вызывает метод write файла, передавая в качестве аргумента строку.

     Объект Unpickler вызывает метод read файла со счетчиком байтов и метод readline без аргументов.

Любой объект, имеющий эти атрибуты, может быть передан в качестве параметра file. В частности, аргумент file может быть экземпляром
класса Python, предоставляющего методы read/write (то есть, поддерживающим ин тер фейс файлов). Благодаря этому можно произвольно отображать сериализованные потоки в объекты, находящиеся в памяти с классами. Например, класс io.BytesIO, имеющийся в стандартной библиотеке и обсуждавшийся в главе 3, предоставляет интерфейс, отображающий обращения к файлам на строки байтов в памяти, благодаря чему его экземпляры могут служить альтернативой использованию строковых функций dumps/loads из модуля pickler.

Можно также пересылать объекты Python через сеть, заключая сокеты в оболочку, выглядящую как файл и вызывающую методы сериализации у отправителя и методы обратного преобразования у получателя (подробнее об этом рассказывается в разделе «Придание сокетам внешнего вида файлов и потоков ввода-вывода» в главе 12). Фактически передача сериализованных объектов Python по сети между доверенными узлами является более простой альтернативой использованию сетевых транспортных протоколов, таких как SOAP и XML-RPC, при условии что с обоих концов соединения находится Python (сериализованные объекты передаются не в виде XML, а в формате, специфическом для Python).

Последние изменения: В Python 3.X сериализованные объекты всегда представлены в виде строк bytes, а не str независимо от запрошенного уровня протокола (даже при запросе старейшего протокола ASCII возвращается строка байтов). Вследствие этого файлы, используемые для сохранения сериализованных объектов Python, всегда должны открываться в двоичном режиме. Кроме того, в 3.X также автоматически выбирается и используется оптимизированная реализация модуля_р1ск1е, если она присутствует. Подробнее обе эти темы описываются ниже.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий