Сериализация объектов в C++: библиотеки, методы и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Сериализация объектов в C++: полное руководство

Сериализация — это процесс преобразования сложных структур данных (объектов классов, контейнеров) в последовательный формат (байтовый поток, строку JSON, XML), пригодный для сохранения в файл или передачи по сети. Обратный процесс — десериализация — восстанавливает объект из этого формата. В C++, где нет встроенной рефлексии, сериализация требует ручного описания или использования специализированных библиотек. В этой статье мы разберём основные подходы и лучшие инструменты для сериализации в C++.

Зачем нужна сериализация?

  • Сохранение состояния — запись игровых сохранений, настроек приложения.
  • Сетевое взаимодействие — передача объектов между клиентом и сервером.
  • Кэширование — сохранение результатов вычислений в файл.
  • Обмен данными — интеграция с другими языками (JSON, Protobuf).

Популярные библиотеки для сериализации в C++

1. Boost.Serialization

Классическая библиотека из состава Boost. Поддерживает бинарную, текстовую и XML-сериализацию. Требует явного добавления методов serialize или save/load.

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

class Person {
public:
    std::string name;
    int age;
    
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & name;
        ar & age;
    }
};

// Сохранение
void save(const Person& p) {
    std::ofstream ofs("person.txt");
    boost::archive::text_oarchive oa(ofs);
    oa << p;
}

// Загрузка
Person load() {
    Person p;
    std::ifstream ifs("person.txt");
    boost::archive::text_iarchive ia(ifs);
    ia >> p;
    return p;
}

2. Cereal

Современная, лёгкая библиотека (только заголовочные файлы). Поддерживает JSON, XML, бинарный формат. Не требует наследования от базовых классов. Отлично подходит для проектов, где не нужен весь Boost.

#include <cereal/archives/json.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/vector.hpp>
#include <fstream>

struct Student {
    std::string name;
    std::vector<int> grades;
    
    template<class Archive>
    void serialize(Archive& ar) {
        ar(CEREAL_NVP(name), CEREAL_NVP(grades));
    }
};

// Сохранение в JSON
void saveStudent(const Student& s) {
    std::ofstream ofs("student.json");
    cereal::JSONOutputArchive archive(ofs);
    archive(CEREAL_NVP(s));
}

// Загрузка из JSON
Student loadStudent() {
    Student s;
    std::ifstream ifs("student.json");
    cereal::JSONInputArchive archive(ifs);
    archive(s);
    return s;
}

3. nlohmann/json (JSON для современного C++)

Не является библиотекой сериализации в классическом понимании, но позволяет легко конвертировать объекты в JSON и обратно. Требует ручного написания функций преобразования.

#include <nlohmann/json.hpp>
using json = nlohmann::json;

struct Point {
    int x, y;
};

void to_json(json& j, const Point& p) {
    j = json{{"x", p.x}, {"y", p.y}};
}

void from_json(const json& j, Point& p) {
    j.at("x").get_to(p.x);
    j.at("y").get_to(p.y);
}

// Использование
Point p1{10, 20};
json j = p1;                  // сериализация
Point p2 = j.get<Point>();    // десериализация

4. Protocol Buffers (protobuf)

Разработан Google. Требует описания структур в .proto файлах, после чего генерируется код на C++. Обещает компактный бинарный формат и высокую скорость.

// Файл person.proto
syntax = "proto3";
message Person {
    string name = 1;
    int32 age = 2;
}

// Сгенерированный код (пример использования)
#include "person.pb.h"

Person p;
p.set_name("Alice");
p.set_age(30);

std::string data;
p.SerializeToString(&data);   // сериализация

Person p2;
p2.ParseFromString(data);     // десериализация

Сравнение библиотек

Библиотека Форма

Рекомендаций