Qu'est-ce que cereal et pourquoi l'utiliser ?
cereal est une bibliothèque de sérialisation légère et "header-only" pour le langage C++. Elle permet de convertir des structures de données complexes (classes, structures, conteneurs STL) en formats tels que JSON, XML et format binaire, puis de les restaurer. C'est essentiel pour sauvegarder l'état d'un programme, transmettre des données sur un réseau, journaliser ou échanger des informations entre différents langages de programmation.
Contrairement à des solutions plus lourdes (comme Boost.Serialization), cereal ne nécessite ni compilation préalable ni configuration complexe. Elle est entièrement composée de fichiers d'en-tête, ce qui simplifie son intégration dans n'importe quel projet. Ses principaux avantages :
- Header-only : pas besoin de compiler la bibliothèque séparément.
- Support C++11/14/17 : utilise les fonctionnalités modernes du langage.
- Flexibilité : prend en charge les types personnalisés, les pointeurs intelligents, le polymorphisme.
- Performance : le format binaire est très rapide et compact.
Installation
Puisque cereal est une bibliothèque "header-only", l'installation se résume à copier les fichiers d'en-tête dans votre projet. Pas de pip install ou npm install pour C++ requis. Voici deux méthodes principales :
Méthode 1 : Installation manuelle (recommandée pour l'apprentissage)
- Téléchargez la dernière version depuis GitHub (bouton vert "Code" → "Download ZIP").
- Décompressez l'archive.
- Copiez le dossier
include/cerealdans le dossier de votre projet. - Dans votre code, incluez :
#include "cereal/cereal.hpp".
Méthode 2 : Via le gestionnaire de paquets vcpkg
# Installez vcpkg si ce n'est pas déjà fait
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat # Windows
./bootstrap-vcpkg.sh # Linux/macOS
# Installez cereal
.\vcpkg install cereal # Windows
./vcpkg install cereal # Linux/macOS
# Ajoutez dans CMakeLists.txt :
# find_package(cereal CONFIG REQUIRED)
# target_link_libraries(votre_projet PRIVATE cereal::cereal)
Premiers pas avec un exemple de code
Créons une structure simple Personne et sérialisons-la en JSON. Créez un fichier main.cpp :
#include <iostream>
#include <fstream>
#include <string>
#include <cereal/archives/json.hpp>
#include <cereal/types/string.hpp>
struct Personne {
std::string nom;
int age;
// Méthode obligatoire pour cereal
template<class Archive>
void serialize(Archive& archive) {
archive(nom, age);
}
};
int main() {
Personne p1{"Alice", 30};
// Écriture dans un fichier
{
std::ofstream fichier("personne.json");
cereal::JSONOutputArchive archive(fichier);
archive(CEREAL_NVP(p1)); // CEREAL_NVP pour des champs nommés
}
// Lecture depuis un fichier
Personne p2;
{
std::ifstream fichier("personne.json");
cereal::JSONInputArchive archive(fichier);
archive(p2);
}
std::cout << "Nom : " << p2.nom << ", Âge : " << p2.age << std::endl;
return 0;
}
Compilez : g++ -std=c++11 main.cpp -o main. Après exécution, le fichier personne.json contiendra {"p1": {"nom": "Alice", "age": 30}}.
Méthodes et fonctions principales
Voici les éléments clés de la bibliothèque. Tous les exemples supposent #include <cereal/cereal.hpp> et les archives correspondantes.
1. cereal::JSONOutputArchive
Fonction : Crée une archive pour écrire des données au format JSON.
Paramètres : Prend une référence à un std::ostream