Исходный код EJIO.utils.serialization.serializable
## /utils/serialization/serializable.py
from ..interface import Dictable
from .serializer import Serializer
from .err import SerializationError
from typing import Protocol, Self, Any
__all__ = [
'Serializable',
]
[документация]
class Serializable(Dictable, Protocol):
"""
Интерфейс сериализуемых объектов, поддерживающий преобразование в строку и из строки с любым сериализатором.
Объекты должны уметь преобразовываться в/из словаря (Dictable),
а также работать с внешним сериализатором.
"""
__slots__ = ()
[документация]
def serialize(self, serializer: type[Serializer], /, **kwargs: Any) -> str:
"""
Сериализовать объект с помощью переданного сериализатора.
:param serializer: Класс сериализатора (например, JSONSerializer).
:param kwargs: Ключевые параметры для сереализатора.
:return: Строка с сериализованными данными.
:raises SerializationError: В случае ошибок сериализации.
"""
try:
return serializer.serialize(self.to_dict(), **kwargs)
except SerializationError as e:
raise SerializationError(
f"Serialization of {self.__class__.__name__} using {serializer.__name__} failed") from e
[документация]
@classmethod
def deserialize(cls, data: str, serializer: type[Serializer], /, **kwargs: Any) -> Self:
"""
Десериализовать объект из строки с использованием сериализатора.
:param data: сериализованная строка.
:param serializer: Класс сериализатора.
:param kwargs: Ключевые параметры для сереализатора.
:return: Новый экземпляр объекта.
:raises SerializationError: В случае ошибок десериализации.
"""
try:
return cls.from_dict(serializer.deserialize(data, **kwargs))
except SerializationError as e:
raise SerializationError(f"Deserialization of {cls.__name__} using {serializer.__name__} failed") from e