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; También en la biblioteca
Registro en Kotlin: mejores bibliotecas y herramientas para el desarrollo
Validación de datos en Swift: biblioteca Validator
Geolocalización y mapas en C++: revisión de bibliotecas y herramientas
Envío de SMS en C# (.NET): Integración con API de servicios SMS