Sérialisation d'objets en C++ : aperçu des outils et bibliothèques
\n\nLa sérialisation est le processus de conversion de structures de données complexes (objets, tableaux, graphes) en un format linéaire (flux d'octets, chaîne JSON, XML) qui peut être sauvegardé dans un fichier, transmis sur un réseau ou écrit dans une base de données. Le processus inverse — la désérialisation — restaure l'état initial de l'objet. En C++, il n'existe pas de support intégré pour la réflexion (comme en Java ou Python), donc pour la sérialisation, il faut soit écrire le code manuellement, soit utiliser des bibliothèques prêtes à l'emploi. Dans cet article, nous allons passer en revue les outils les plus populaires et efficaces pour la sérialisation en C++.
\n\n1. Boost.Serialization
\n\nLa bibliothèque la plus ancienne et la plus puissante. Elle fait partie de Boost et nécessite une installation séparée. Elle prend en charge l'archivage binaire, textuel (XML) et son propre format portable.
\n\n- \n
- Avantages : prise en charge approfondie de STL, des pointeurs intelligents, du polymorphisme, des références cycliques ; gestion des versions ; compatibilité entre différentes plateformes. \n
- Inconvénients : syntaxe lourde, compilation lente, taille importante du fichier exécutable. \n
#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <fstream>\n#include <vector>\n\nstruct Person {\n std::string name;\n int age;\n std::vector<std::string> tags;\n\n template<class Archive>\n void serialize(Archive & ar, const unsigned int version) {\n ar & name;\n ar & age;\n ar & tags;\n }\n};\n\nint main() {\n Person p{"Alice", 30, {"developer", "cpp"}};\n std::ofstream ofs("person.txt");\n boost::archive::text_oarchive oa(ofs);\n oa << p;\n\n // Désérialisation\n Person restored;\n std::ifstream ifs("person.txt");\n boost::archive::text_iarchive ia(ifs);\n ia >> restored;\n return 0;\n}\n\n2. Cereal
\n\nUne bibliothèque moderne, légère et header-only (ne nécessite pas de compilation). Fonctionne avec C++11 et versions ultérieures. Prend en charge les formats JSON, XML et binaires. Très populaire dans l'industrie du jeu vidéo et le développement embarqué.
\n\n- \n
- Avantages : frais généraux minimaux, API intuitive, prise en charge des pointeurs intelligents, du polymorphisme, des conteneurs STL. \n
- Inconvénients : moins d'options de personnalisation que Boost. \n
#include <cereal/archives/json.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/string.hpp>\n#include <sstream>\n\nstruct Person {\n std::string name;\n int age;\n\n template<class Archive>\n void serialize(Archive & ar) {\n ar(CEREAL_NVP(name), CEREAL_NVP(age));\n }\n};\n\nint main() {\n Person p{"Bob", 25};\n std::ostringstream oss;\n {\n cereal::JSONOutputArchive archive(oss);\n archive(CEREAL_NVP(p));\n }\n std::cout << oss.str() << std::endl;\n\n // Désérialisation\n Person restored;\n std::istringstream iss(oss.str());\n {\n cereal::JSONInputArchive archive(iss);\n archive(restored);\n }\n return 0;\n}\n\n3. nlohmann/json (JSON for Modern C++)
\n\nLa bibliothèque la plus populaire pour travailler avec JSON en C++. Bien qu'elle ne soit pas initialement conçue pour la sérialisation d'objets, elle peut être facilement adaptée à l'aide de convertisseurs personnalisés (modèle d'adaptateur).
\n\n- \n
- Avantages : syntaxe simple et élégante, excellente documentation, header-only, intégration avec tout type de données. \n
- Inconvénients : fonctionne uniquement avec JSON, ne prend pas en charge les formats binaires, nécessite une description manuelle pour les graphes d'objets complexes. \n
#include <nlohmann/json.hpp>\n#include <fstream>\n\nusing json = nlohmann::json;\n\nstruct Point {\n double x, y;\n