Время прочтения: 3 мин.
Немного теории.
Что такое сериализация?
Сериализацией называют преобразование информации либо в двоичную, либо в текстовую форму. Если объект сериализуется в текстовый вид, то тут можно использовать разные форматы, например, XML и JSON.
JSON — один из популярных форматов для сериализации, который полностью не зависит от языка программирования, на котором реализована программа, но использует соглашения, знакомые программистам C-подобных языков.
Соответственно, десериализация – это обратное преобразование битов в объекты.
Сериализация нужна, когда требуется сохранить большие данные в плоские файлы и извлечь на более позднем этапе. Без сериализации осуществить это сложно, может возникать множество ошибок из-за сложности структур данных.
Сериализация с использованием Python.
Для работы с сериализацией в Python существуют специальные библиотеки, одной из них является Marsmallow.
Marshmallow, представляет собой объектно-реляционную картографическую библиотеку, которая используется для преобразования объектов в типы данных Python и обратно. Она часто используется вместе с SQLAlchemy, ORM, которая сопоставляет схемы баз данных с объектами Python. Давайте посмотрим, как использовать Marshmallow.
Во-первых, нам нужно создать схему для моделирования того, что мы хотим сериализовать и десериализовать. Давайте создадим модель для нашей схемы, которая называется Client.
import datetime as dt
class Client:
def __init__(self, name, inn):
self.name = name
self.inn = inn
self.created_at = dt.datetime.now()
Затем необходимо создать схему, используя класс, который сопоставляет имена атрибутов с объектами полей.
from marshmallow import Schema, fields
class ClientSchema(Schema):
id = fields.Integer()
name = fields.Str()
inn = fields.Str()
created_at = fields.DateTime()
Сериализация объектов.
Мы передаем объект в метод dump(s) схемы для сериализации (object to Python type), и мы используем метод dumps() для возврата строки в кодировке JSON или dump (), если мы хотим вернуть дикт объекта.
client = Client(id = 1,name="ООО", inn="000000000")
schema = ClientSchema()
result = schema.dumps(client)
result
#Output: {"created_at": "2021-08-06T08:19:57.258180", "name": "OOO", "id": 1, "inn": "000000000"}
Мы также можем отфильтровать, какие поля мы хотим вывести
short_schema = ClientSchema(only=("name", "inn"))
short_schema.dump(client)
#Output: {'inn': '000000000', 'name': 'ООО'}
Десериализация объектов.
По умолчанию метод load возвращает Python dict с отображением имен полей и значений.
client_data = {
"created_at": "2021-08-06T08:19:57.258180",
"id": "1",
"inn": "000000000",
"name": "OOO",
}
schema = ClientSchema()
result = schema.load(client_data)
result
#Output: {'created_at': datetime.datetime(2021, 8, 6, 8, 19, 57, 258180), 'id': 1, 'inn': '000000000','name': 'OOO'}
Итак, мы видим, что сериализация и десериализация объектов в Python является важной неотъемлемой частью любой программы. Сериализация полезна для больших данных, для упрощения работы при их передаче и сохранении.
На примере модели схемы Client можно убедиться, что Marshmallow является мощным инструментом для сериализации. При использовании сериализатора будет достаточно одной строки для сохранения словаря, а при написании кода вручную, получится объемный и скорее всего глючный код. Так что плюсы использования сериализаторов очевидны.