cereal
Легковесная библиотека сериализации на C++11, разработанная для эффективного и безопасного преобразования данных в различные форматы. Библиотека работает по принципу "header-only", не имеет внешних зависимостей и предоставляет простой, интуитивно понятный API для сохранения и загрузки данных в бинарном, XML и JSON форматах. cereal поддерживает широкий спектр типов, включая все контейнеры стандартной библиотеки, умные указатели и пользовательские классы.
Особенности
- поддержка трёх форматов сериализации: бинарный, XML и JSON;
- поддержка версионирования классов для обратной совместимости;
- работа с умными указателями, полиморфными типами и наследованием;
- сериализация всех контейнеров STL без необходимости дополнительного кода;
- возможность именования полей для человеко-читаемых форматов.
Основные компоненты
Библиотека состоит из нескольких модулей, обеспечивающих работу с различными форматами сериализации и поддержку разнообразных типов данных (подробнее с документацией можно ознакомиться здесь).
Архивы сериализации
Архивы являются центральным компонентом библиотеки и отвечают за преобразование данных в целевой формат и обратно. Каждый архив представляет собой класс, работающий с потоком ввода-вывода и реализующий RAII-подход для гарантированной записи данных.
Основные классы архивов:
cereal::BinaryOutputArchiveиcereal::BinaryInputArchive— бинарная сериализация с максимальной производительностью и компактностью;cereal::PortableBinaryOutputArchiveиcereal::PortableBinaryInputArchive— переносимый бинарный формат, одинаковый на всех платформах;cereal::XMLOutputArchiveиcereal::XMLInputArchive— человеко-читаемый XML-формат с поддержкой именованных полей;cereal::JSONOutputArchiveиcereal::JSONInputArchive— JSON-формат для обмена данными с веб-приложениями.
Сериализация пользовательских классов
Для поддержки пользовательских типов необходимо определить метод сериализации. Библиотека предоставляет несколько гибких подходов к описанию процесса сериализации.
Основные методы:
template<class Archive> void serialize(Archive & archive)— встроенный метод класса, который архивирует все необходимые поля;template<class Archive> void save(Archive & archive) constиtemplate<class Archive> void load(Archive & archive)— раздельные методы для сохранения и загрузки, позволяющие реализовать различную логику;template<class Archive> void serialize(Archive & archive, const std::uint32_t version)— метод с поддержкой версионирования класса;CEREAL_SERIALIZE(archive, ...)— макрос для объявления дружественной функции сериализации вне класса.
Именованные значения
Для человеко-читаемых форматов (XML, JSON) библиотека поддерживает именование полей, что делает выводимые данные более понятными и структурированными.
Основные функции для работы с именами:
CEREAL_NVP(variable)— макрос, создающий пару имя-значение с именем, совпадающим с именем переменной;cereal::make_nvp(name, variable)— функция для создания пары с произвольным именем.
Версионирование классов
cereal поддерживает версионирование классов, что позволяет изменять структуру данных с сохранением обратной совместимости со старыми файлами.
Основные элементы версионирования:
CEREAL_CLASS_VERSION(ClassName, VersionNumber)— макрос для объявления версии класса;version— дополнительный параметр в методеserialize, содержащий версию класса.
Полиморфизм и наследование
Библиотека предоставляет механизмы для корректной сериализации иерархий классов с виртуальными функциями.
Ключевые возможности:
cereal::base_class<Base>(derived)— обёртка для сериализации базового класса;CEREAL_REGISTER_TYPE(Derived)— макрос для регистрации производного класса в системе полиморфной сериализации;CEREAL_REGISTER_POLYMORPHIC_RELATION(Base, Derived)— явное указание отношений наследования.
Минимальная сериализация
Для простых типов данных cereal предоставляет механизм минимальной сериализации, который автоматически генерирует код для сериализации всех public-полей класса.
Основные компоненты:
CEREAL_SERIALIZE(archive, ...)— макрос для автоматической сериализации списка полей;CEREAL_LOAD_MINIMAL_FUNCTION_NAMEиCEREAL_SAVE_MINIMAL_FUNCTION_NAME— настройка имён функций для минимальной сериализации.