Сериализация объектов в 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); // десериализация
Сравнение библиотек
| Библиотека | Форма
Также в библиотекеРекомендаций |
|---|