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