Serialización de objetos en C++: bibliotecas y métodos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Serialización de objetos en C++: revisión de herramientas y bibliotecas



La serialización es el proceso de convertir estructuras de datos complejas (objetos, arreglos, grafos) en un formato lineal (flujo de bytes, cadena JSON, XML) que se puede guardar en un archivo, transmitir por la red o escribir en una base de datos. El proceso inverso, la deserialización, restaura el estado original del objeto. En C++ no hay soporte incorporado para reflexión (como en Java o Python), por lo que para serializar es necesario escribir código manualmente o utilizar bibliotecas ya preparadas. En este artículo analizaremos las herramientas más populares y eficientes para la serialización en C++.



1. Boost.Serialization



La biblioteca más antigua y potente. Forma parte de Boost y requiere instalación por separado. Soporta archivado binario, textual (XML) y portátil propio.



  • Ventajas: soporte profundo de STL, punteros inteligentes, polimorfismo, referencias cíclicas; versionado; compatibilidad entre diferentes plataformas.
  • Desventajas: sintaxis engorrosa, compilación lenta, gran tamaño del archivo ejecutable.


#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;

// Deserialización Person restored; std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> restored; return 0;}


2. Cereal



Biblioteca moderna, ligera y header-only (no requiere compilación). Funciona con C++11 y superior. Soporta formatos JSON, XML y binarios. Muy popular en la industria de los videojuegos y el desarrollo embebido.



  • Ventajas: gastos generales mínimos, API intuitiva, soporte para punteros inteligentes, polimorfismo, contenedores STL.
  • Desventajas: menos opciones de personalización que 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;

// Deserialización Person restored; std::istringstream iss(oss.str()); { cereal::JSONInputArchive archive(iss); archive(restored); } return 0;}


3. nlohmann/json (JSON for Modern C++)



La biblioteca más popular para trabajar con JSON en C++. Aunque originalmente no está diseñada para la serialización de objetos, se puede adaptar fácilmente mediante convertidores personalizados (patrón adapter).



  • Ventajas: sintaxis simple y elegante, excelente documentación, header-only, integración con cualquier tipo.
  • Desventajas: solo funciona con JSON, no soporta formatos binarios, para grafos complejos de objetos se requiere descripción manual.


#include <nlohmann/json.hpp>#include <fstream>

using json = nlohmann::json;

struct Point { double x, y;

Recommendations