Сериализация может показаться сложной, когда сталкиваешься с ней впервые, но отрадно узнать, что 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