Время прочтения: 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 является мощным инструментом для сериализации. При использовании сериализатора будет достаточно одной строки для сохранения словаря, а при написании кода вручную, получится объемный и скорее всего глючный код. Так что плюсы использования сериализаторов очевидны.