Serialização de objetos em C++: guia completo
Serialização é o processo de converter estruturas de dados complexas (objetos de classes, contêineres) em um formato sequencial (fluxo de bytes, string JSON, XML) adequado para salvar em arquivo ou transmitir pela rede. O processo inverso — desserialização — restaura o objeto a partir desse formato. Em C++, onde não há reflexão embutida, a serialização requer descrição manual ou o uso de bibliotecas especializadas. Neste artigo, abordaremos as principais abordagens e as melhores ferramentas para serialização em C++.
Para que serve a serialização?
- Salvamento de estado — gravação de saves de jogos, configurações de aplicativos.
- Comunicação em rede — transmissão de objetos entre cliente e servidor.
- Cache — armazenamento de resultados de cálculos em arquivo.
- Troca de dados — integração com outras linguagens (JSON, Protobuf).
Bibliotecas populares para serialização em C++
1. Boost.Serialization
Biblioteca clássica do conjunto Boost. Suporta serialização binária, textual e XML. Requer a adição explícita dos métodos serialize ou 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; }};
// Salvamentovoid save(const Person& p) { std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa << p;}
// CarregamentoPerson load() { Person p; std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> p; return p;}2. Cereal
Biblioteca moderna e leve (apenas arquivos de cabeçalho). Suporta JSON, XML e formato binário. Não requer herança de classes base. Ideal para projetos que não precisam de todo o 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)); }};
// Salvamento em JSONvoid saveStudent(const Student& s) { std::ofstream ofs("student.json"); cereal::JSONOutputArchive archive(ofs); archive(CEREAL_NVP(s));}
// Carregamento de JSONStudent loadStudent() { Student s; std::ifstream ifs("student.json"); cereal::JSONInputArchive archive(ifs); archive(s); return s;}3. nlohmann/json (JSON para C++ moderno)
Não é uma biblioteca de serialização no sentido clássico, mas permite converter facilmente objetos para JSON e vice-versa. Requer a escrita manual de funções de conversão.
#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);}
// UsoPoint p1{10, 20};json j = p1; // serializaçãoPoint p2 = j.get<Point>(); // desserialização4. Protocol Buffers (protobuf)
Desenvolvido pelo Google. Requer a descrição das estruturas em arquivos .proto, após o que o código C++ é gerado. Oferece formato binário compacto e alta velocidade.
// Arquivo person.protosyntax = "proto3";message P Também na biblioteca
Trabalhando com S3 e armazenamentos em nuvem em TypeScript: guia completo
Trabalhando com Excel em TypeScript: bibliotecas, exemplos e ferramentas
Config para Rust: guia completo com exemplos práticos