Sérialisation d'objets en Rust : Serde et autres outils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sérialisation d'objets en Rust : aperçu des bibliothèques et outils

\n\n

La sérialisation est l'un des processus fondamentaux du développement logiciel. Elle permet de convertir des structures de données complexes (objets, structures, énumérations) en un format séquentiel, pratique pour le stockage sur disque ou la transmission réseau. Le processus inverse — la désérialisation — restaure les objets d'origine à partir de ce format. En langage Rust, cette tâche est résolue par un écosystème dont la pièce maîtresse est la bibliothèque Serde (Serialization/Deserialization).

\n\n

Dans cet article, nous allons voir en détail comment fonctionne la sérialisation en Rust, quelles bibliothèques existent pour cela, et comment les utiliser en pratique.

\n\n

Pourquoi Serde ?

\n\n

Serde n'est pas simplement une bibliothèque, mais un framework de sérialisation et de désérialisation. Sa principale caractéristique est la division en deux parties :

\n\n
    \n
  • Serde Data Model — le noyau qui définit comment les types de données Rust sont convertis en une représentation intermédiaire.
  • \n
  • Adaptateurs de formats — des crates séparés qui travaillent avec des formats spécifiques (JSON, YAML, TOML, Bincode, MessagePack et autres).
  • \n
\n\n

Cette approche permet d'utiliser le même code pour travailler avec différents formats, en changeant seulement une ligne dans Cargo.toml.

\n\n

Installation et configuration de base

\n\n

Pour commencer, ajoutez les dépendances suivantes à votre Cargo.toml :

\n\n
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"
\n\n

La caractéristique clé est l'utilisation de l'attribut #[derive(Serialize, Deserialize)]. Il génère automatiquement le code pour convertir vos structures :

\n\n
use serde::{Serialize, Deserialize};\n\n#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n    id: u64,\n    name: String,\n    email: String,\n    is_active: bool,\n}\n\nfn main() {\n    let user = User {\n        id: 42,\n        name: "Alexei".to_string(),\n        email: "alex@example.com".to_string(),\n        is_active: true,\n    };\n\n    // Sérialisation en JSON\n    let json = serde_json::to_string_pretty(&user).unwrap();\n    println!("JSON :\\n{}", json);\n\n    // Désérialisation inverse\n    let deserialized: User = serde_json::from_str(&json).unwrap();\n    println!("Restauré : {:?}", deserialized);\n}
\n\n

Travail avec différents formats

\n\n

Serde prend en charge des dizaines de formats. Examinons les plus populaires :

\n\n

JSON (serde_json)

\n

Le format le plus courant pour les API web. Lisible par l'homme, mais prend beaucoup de place.

\n\n
// Sérialisation en chaîne\nlet json_str = serde_json::to_string(&data)?;\n\n// Sérialisation en flux (fichier)\nlet file = std::fs::File::create("data.json")?;\nlet writer = std::io::BufWriter::new(file);\nserde_json::to_writer(writer, &data)?;\n\n// Lecture depuis un fichier\nlet file = std::fs::File::open("data.json")?;\nlet reader = std::io::BufReader::new(file);\nlet data: MyStruct = serde_json::from_reader(reader)?;
\n\n

Bincode (bincode)

\n

Format binaire — compact et rapide. Idéal pour le stockage interne ou la transmission entre services Rust.

\n\n
// Cargo.toml : bincode = "1.3"\n\nlet encoded: Vec<u8> = bincode::serialize(&data)?;\nlet decoded: MyStruct = bincode::deserialize(&encoded)?;
\n\n

YAML et TOML (serde_yaml, toml)

\n

Utilisés pour les fichiers de configuration. Lisibles par l'homme, prennent en charge les commentaires (YAML).

\n\n
// YAML\nlet yaml = serde_yaml::to_string(&data)?;\nlet data: MyStruct = serde_yaml::from_str(&yaml)?;\n\n// TOML (populaire dans l'écosystème Rust)\nlet toml = toml::to_string(&data)?;\nlet data: MyStruct = toml::from_str(&toml)?;
\n\n

Fonctionnalités avancées : attributs Serde

\n\n

Serde fournit des attributs puissants pour un réglage fin de la sérialisation :

\n\n
#[derive(Serialize, Deser                    

Recommendations