Исходный код EJIO.utils.serialization.implementations.msgpack_serializer
## /utils/serialization/implementations/msgpack_serializer.py
from msgpack import packb, unpackb, pack, unpack
from os.path import exists
from typing import Any
from ..serializer import Serializer
from ..serializer_registry import register_serializer
from ..err import SerializationError
__all__ = [
'MessagePackSerializer'
]
[документация]
@register_serializer('msgpack')
class MessagePackSerializer(Serializer):
"""
Реализация интерфейса Serializer для бинарного формата MessagePack.
"""
__slots__ = ()
[документация]
@staticmethod
def serialize[T](data: dict[str, T], /, **kwargs: Any) -> str:
"""
Преобразовать словарь в строку, закодированную через MessagePack.
:param data: Сериализуемый словарь.
:param kwargs: Ключевые параметры для сереализатора.
:return: Текстовое представление байтового потока.
:raises SerializationError: При ошибках сериализации.
"""
try:
packed_bytes = packb(data, use_bin_type=True)
return packed_bytes.decode('latin-1')
except Exception as e:
raise SerializationError("Serialization to msgpack failed") from e
[документация]
@staticmethod
def deserialize[T](data: str, /, **kwargs: Any) -> dict[str, T]:
"""
Преобразовать закодированную строку обратно в словарь.
:param data: Строковое представление байтового потока.
:param kwargs: Ключевые параметры для сереализатора.
:return: Десериализованный словарь.
:raises SerializationError: При ошибках десериализации.
"""
try:
packed_bytes = data.encode('latin-1')
result = unpackb(packed_bytes, raw=False)
if not isinstance(result, dict):
raise SerializationError("MessagePack data must represent a dictionary")
return result
except Exception as e:
raise SerializationError("Deserialization from msgpack failed") from e
[документация]
@staticmethod
def save[T](data: dict[str, T], filename: str, /, **kwargs: Any) -> None:
"""
Сохранить словарь в бинарный файл MessagePack.
:param data: Сериализуемый словарь.
:param filename: Путь к файлу для сохранения.
:param kwargs: Ключевые параметры для сереализатора.
:raises SerializationError: При ошибках сериализации.
"""
try:
with open(filename, 'wb') as f:
pack(data, f, use_bin_type=True)
except (IOError, OSError, Exception) as e:
raise SerializationError("Failed to serialize data to file") from e
[документация]
@staticmethod
def load[T](filename: str, /, **kwargs: Any) -> dict[str, T]:
"""
Загрузить словарь из бинарного файла MessagePack.
:param filename: Путь к файлу для загрузки.
:param kwargs: Ключевые параметры для сереализатора.
:return: Словарь, полученный из файла.
:raises SerializationError: При ошибках десериализации.
"""
try:
if not exists(filename):
raise FileNotFoundError(f"File {filename} not found")
with open(filename, 'rb') as f:
result = unpack(f, raw=False)
if not isinstance(result, dict):
raise SerializationError("MessagePack file data must represent a dictionary")
return result
except (IOError, OSError, FileNotFoundError, Exception) as e:
raise SerializationError("Failed to deserialize data from file") from e