2026-07-12 01:39:26 +03:00
|
|
|
/*
|
|
|
|
|
* Copyright 2026 Safronov Grigorii
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the CDDL, Version 1.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
*
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
* https://opensource.org/licenses/CDDL-1.0
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// Файл: internal/serializer/msgpack.go
|
|
|
|
|
// Назначение: Сериализация и десериализация документов в формате MessagePack.
|
2026-10-04 20:18:32 +00:00
|
|
|
// Используется библиотека vmihailenco/msgpack/v5 для высокой производительности.
|
|
|
|
|
//
|
|
|
|
|
// MessagePack — это эффективный бинарный формат сериализации, который:
|
|
|
|
|
// - компактнее JSON (меньше размер);
|
|
|
|
|
// - быстрее при сериализации/десериализации;
|
|
|
|
|
// - поддерживает все основные типы данных;
|
|
|
|
|
// - позволяет сериализовать структуры Go с учётом тегов `msgpack`/`json`
|
|
|
|
|
// (поведение зависит от настроек библиотеки).
|
|
|
|
|
//
|
|
|
|
|
// Данный пакет предоставляет простую обёртку для унификации
|
|
|
|
|
// использования MessagePack во всём проекте.
|
2026-07-12 01:39:26 +03:00
|
|
|
|
2026-10-04 20:18:32 +00:00
|
|
|
// Package serializer предоставляет обёртки над сериализацией в формат
|
|
|
|
|
// MessagePack. Используется для эффективного хранения и передачи
|
|
|
|
|
// документов внутри СУБД futriis.
|
2026-07-12 01:39:26 +03:00
|
|
|
package serializer
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/vmihailenco/msgpack/v5"
|
|
|
|
|
)
|
|
|
|
|
|
2026-10-04 20:18:32 +00:00
|
|
|
// Marshal сериализует значение в формат MessagePack.
|
|
|
|
|
//
|
|
|
|
|
// Параметры:
|
|
|
|
|
// - v: любое значение Go (структура, карта, срез, примитив и т.д.).
|
|
|
|
|
//
|
|
|
|
|
// Возвращает:
|
|
|
|
|
// - []byte: сериализованные данные;
|
|
|
|
|
// - error: ошибка при сериализации (например, при наличии
|
|
|
|
|
// несериализуемых типов, таких как каналы или функции).
|
|
|
|
|
//
|
|
|
|
|
// Пример использования:
|
|
|
|
|
//
|
|
|
|
|
// data, err := serializer.Marshal(myStruct)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return err
|
|
|
|
|
// }
|
|
|
|
|
// // data содержит бинарное представление myStruct
|
2026-07-12 01:39:26 +03:00
|
|
|
func Marshal(v interface{}) ([]byte, error) {
|
|
|
|
|
return msgpack.Marshal(v)
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-04 20:18:32 +00:00
|
|
|
// Unmarshal десериализует данные из формата MessagePack в значение.
|
|
|
|
|
//
|
|
|
|
|
// Параметры:
|
|
|
|
|
// - data: бинарные данные в формате MessagePack;
|
|
|
|
|
// - v: указатель на значение, в которое нужно десериализовать данные.
|
|
|
|
|
//
|
|
|
|
|
// Возвращает:
|
|
|
|
|
// - error: ошибка при десериализации (например, если данные повреждены
|
|
|
|
|
// или не соответствуют типу v).
|
|
|
|
|
//
|
|
|
|
|
// Важно: v должен быть указателем (!), иначе функция вернёт ошибку.
|
|
|
|
|
//
|
|
|
|
|
// Пример использования:
|
|
|
|
|
//
|
|
|
|
|
// var myStruct MyStruct
|
|
|
|
|
// err := serializer.Unmarshal(data, &myStruct)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return err
|
|
|
|
|
// }
|
|
|
|
|
// // myStruct содержит восстановленные данные
|
2026-07-12 01:39:26 +03:00
|
|
|
func Unmarshal(data []byte, v interface{}) error {
|
|
|
|
|
return msgpack.Unmarshal(data, v)
|
2026-10-04 20:18:32 +00:00
|
|
|
}
|