Sérialisation d'objets en Rust : aperçu des bibliothèques et outils
\n\nLa 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\nDans 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\nPourquoi Serde ?
\n\nSerde 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
Cette approche permet d'utiliser le même code pour travailler avec différents formats, en changeant seulement une ligne dans Cargo.toml.
Installation et configuration de base
\n\nPour commencer, ajoutez les dépendances suivantes à votre Cargo.toml :
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\nLa caractéristique clé est l'utilisation de l'attribut #[derive(Serialize, Deserialize)]. Il génère automatiquement le code pour convertir vos structures :
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\nTravail avec différents formats
\n\nSerde prend en charge des dizaines de formats. Examinons les plus populaires :
\n\nJSON (serde_json)
\nLe 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\nBincode (bincode)
\nFormat 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\nYAML et TOML (serde_yaml, toml)
\nUtilisé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\nFonctionnalités avancées : attributs Serde
\n\nSerde fournit des attributs puissants pour un réglage fin de la sérialisation :
\n\n#[derive(Serialize, Deser Aussi dans la bibliothèque
ORM pour C++ : comparaison et exemples d'utilisation des bibliothèques
Jetons JWT en Rust : bibliothèques et implémentation de l'authentification
Configuration des applications Swift : outils et bibliothèques pour iOS/macOS
Tests en JavaScript (Node.js) : frameworks et outils