Serialização de objetos em C++: bibliotecas, métodos e exemplos de código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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ção


4. 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                    

Recommendations