Serialização de objetos em C++: visão geral de ferramentas e bibliotecas
Serialização é o processo de converter estruturas de dados complexas (objetos, arrays, grafos) em um formato linear (fluxo de bytes, string JSON, XML) que pode ser salvo em um arquivo, transmitido pela rede ou gravado em um banco de dados. O processo inverso — desserialização — restaura o estado original do objeto. Em C++ não há suporte embutido para reflexão (como em Java ou Python), portanto, para serialização é necessário escrever o código manualmente ou usar bibliotecas prontas. Neste artigo, abordaremos as ferramentas mais populares e eficientes para serialização em C++.
1. Boost.Serialization
A biblioteca mais antiga e poderosa. Faz parte do Boost, requer instalação separada. Suporta arquivamento binário, textual (XML) e portátil próprio.
- Vantagens: suporte profundo para STL, ponteiros inteligentes, polimorfismo, referências cíclicas; versionamento; compatibilidade entre diferentes plataformas.
- Desvantagens: sintaxe verbosa, compilação lenta, tamanho grande do arquivo executável.
#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <boost/serialization/vector.hpp>#include <fstream>#include <vector>
struct Person { std::string name; int age; std::vector<std::string> tags;
template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & name; ar & age; ar & tags; }};
int main() { Person p{"Alice", 30, {"developer", "cpp"}}; std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa << p;
// Desserialização Person restored; std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> restored; return 0;}2. Cereal
Biblioteca moderna, leve, header-only (não requer compilação). Funciona com C++11 e superior. Suporta formatos JSON, XML e binários. Muito popular na indústria de jogos e desenvolvimento embarcado.
- Vantagens: sobrecarga mínima, API intuitiva, suporte para ponteiros inteligentes, polimorfismo, contêineres STL.
- Desvantagens: menos opções de personalização do que o Boost.
#include <cereal/archives/json.hpp>#include <cereal/types/vector.hpp>#include <cereal/types/string.hpp>#include <sstream>
struct Person { std::string name; int age;
template<class Archive> void serialize(Archive & ar) { ar(CEREAL_NVP(name), CEREAL_NVP(age)); }};
int main() { Person p{"Bob", 25}; std::ostringstream oss; { cereal::JSONOutputArchive archive(oss); archive(CEREAL_NVP(p)); } std::cout << oss.str() << std::endl;
// Desserialização Person restored; std::istringstream iss(oss.str()); { cereal::JSONInputArchive archive(iss); archive(restored); } return 0;}3. nlohmann/json (JSON for Modern C++)
A biblioteca mais popular para trabalhar com JSON em C++. Embora originalmente não seja destinada à serialização de objetos, pode ser facilmente adaptada usando conversores personalizados (padrão adapter).
- Vantagens: sintaxe simples e elegante, documentação excelente, header-only, integração com qualquer tipo.
- Desvantagens: funciona apenas com JSON, não suporta formatos binários, para grafos complexos de objetos requer descrição manual.
#include <nlohmann/json.hpp>#include <fstream>
using json = nlohmann::json;
struct Point { double x, y;