Что такое сериализация? Какие библиотеки знаете?cplus-75

Что такое сериализация?

Сериализация - это процесс преобразования объектов или структур данных в последовательность байт для:

  • Сохранения на диск
  • Передачи по сети
  • Обмена между процессами/системами

Десериализация - обратный процесс восстановления объекта из байтового потока.

Основные требования к сериализации:

  1. Сохранение структуры данных
  2. Поддержка сложных типов (вложенные объекты, указатели)
  3. Версионность (обратная совместимость)
  4. Производительность

Популярные библиотеки для C++

1. Boost.Serialization

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class MyClass {
    int x;
    std::string s;
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
        ar & x;
        ar & s;
    }
};

// Сериализация
std::ofstream ofs("data.txt");
boost::archive::text_oarchive oa(ofs);
oa << myObj;

Плюсы:

  • Поддержка сложных графов объектов
  • Разные форматы (бинарный, текст, XML)
  • Версионность

Минусы:

  • Зависимость от Boost
  • Сложный API для пользовательских типов

2. Protocol Buffers

// Определение в .proto файле
message Person {
    required string name = 1;
    optional int32 id = 2;
}

// Использование в C++
Person person;
person.set_name("John");
person.set_id(123);

// Сериализация
std::string data = person.SerializeAsString();

Плюсы:

  • Кросс-языковая поддержка
  • Компактный бинарный формат
  • Генерация кода

Минусы:

  • Требует предварительного описания схемы
  • Нет нативной поддержки полиморфизма

3. nlohmann/json

#include <nlohmann/json.hpp>

struct Person {
    std::string name;
    int age;
};

// Сериализация в JSON
Person p {"Alice", 30};
nlohmann::json j = p; // Автоматическое преобразование
std::string serialized = j.dump();

Плюсы:

  • Человекочитаемый формат
  • Простота использования
  • Поддержка STL-контейнеров

Минусы:

  • Низкая производительность
  • Большой размер данных

4. FlatBuffers

// Схема
table Monster {
    name:string;
    hp:int;
}

// Использование
flatbuffers::FlatBufferBuilder builder;
auto name = builder.CreateString("Orc");
auto monster = CreateMonster(builder, name, 100);
builder.Finish(monster);

// Готовый буфер доступен сразу:
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();

Плюсы:

  • Нулевые затраты на десериализацию
  • Минимальный overhead памяти
  • Поддержка версионности

Минусы:

  • Сложность работы с данными
  • Требует строгой схемы

Критерии выбора библиотеки

  1. Формат данных:

    • JSON/XML для конфигов
    • Protobuf/FlatBuffers для сетевого обмена
    • Boost для сложных объектов
  2. Производительность:

    • FlatBuffers - максимальная скорость
    • Protobuf - баланс скорости и удобства
  3. Совместимость:

    • Protobuf - лучшая кросс-языковая поддержка
    • JSON - универсальная читаемость

Резюмируем

Сериализация - критически важная техника для современных C++ приложений. Выбор инструмента зависит от:

  • Требований к производительности
  • Необходимости кросс-платформенности
  • Сложности сериализуемых данных

Для старта рекомендуется:

  1. nlohmann/json - если нужен читаемый формат
  2. Protobuf - для сетевого взаимодействия
  3. Boost.Serialization - для сложных случаев в монолитных C++ проектах

Главное правило - избегайте самописных решений, когда есть проверенные библиотеки.