Serialisierung von Objekten in Rust: Überblick über Bibliotheken und Werkzeuge
\n\nSerialisierung ist einer der grundlegenden Prozesse in der Softwareentwicklung. Sie ermöglicht es, komplexe Datenstrukturen (Objekte, Strukturen, Aufzählungen) in ein sequenzielles Format umzuwandeln, das sich zum Speichern auf der Festplatte oder zur Übertragung über ein Netzwerk eignet. Der umgekehrte Prozess – die Deserialisierung – stellt die ursprünglichen Objekte aus diesem Format wieder her. In der Sprache Rust wird diese Aufgabe durch ein Ökosystem gelöst, in dessen Zentrum die Bibliothek Serde (Serialization/Deserialization) steht.
\n\nIn diesem Artikel werden wir im Detail besprechen, wie die Serialisierung in Rust funktioniert, welche Bibliotheken es dafür gibt und wie man sie in der Praxis einsetzt.
\n\nWarum Serde?
\n\nSerde ist nicht nur eine Bibliothek, sondern ein Framework für Serialisierung und Deserialisierung. Seine Hauptbesonderheit ist die Aufteilung in zwei Teile:
\n\n- \n
- Serde Data Model – der Kern, der definiert, wie Rust-Datentypen in eine Zwischendarstellung umgewandelt werden. \n
- Format-Adapter – separate Crates, die mit bestimmten Formaten arbeiten (JSON, YAML, TOML, Bincode, MessagePack und andere). \n
Dieser Ansatz ermöglicht es, denselben Code für die Arbeit mit verschiedenen Formaten zu verwenden, indem nur eine Zeile in der Cargo.toml geändert wird.
Einbindung und grundlegende Einrichtung
\n\nFügen Sie zunächst die folgenden Abhängigkeiten zu Ihrer Cargo.toml hinzu:
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\nDie entscheidende Besonderheit ist die Verwendung des Attributs #[derive(Serialize, Deserialize)]. Es generiert automatisch den Code zur Umwandlung Ihrer Strukturen:
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: "Alexej".to_string(),\n email: "alex@example.com".to_string(),\n is_active: true,\n };\n\n // Serialisierung in JSON\n let json = serde_json::to_string_pretty(&user).unwrap();\n println!("JSON:\\n{}", json);\n\n // Deserialisierung zurück\n let deserialized: User = serde_json::from_str(&json).unwrap();\n println!("Wiederhergestellt: {:?}", deserialized);\n}\n\nArbeiten mit verschiedenen Formaten
\n\nSerde unterstützt Dutzende von Formaten. Betrachten wir die gängigsten:
\n\nJSON (serde_json)
\nDas am weitesten verbreitete Format für Web-APIs. Für Menschen lesbar, aber speicherintensiv.
\n\n// Serialisierung in einen String\nlet json_str = serde_json::to_string(&data)?;\n\n// Serialisierung in einen Stream (Datei)\nlet file = std::fs::File::create("data.json")?;\nlet writer = std::io::BufWriter::new(file);\nserde_json::to_writer(writer, &data)?;\n\n// Lesen aus einer Datei\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)
\nEin binäres Format – kompakt und schnell. Ideal für die interne Speicherung oder die Übertragung zwischen Rust-Diensten.
\n\n// Cargo.toml: bincode = "1.3"\n\nlet encoded: Vec<u8> = bincode::serialize(&data)?;\nlet decoded: MyStruct = bincode::deserialize(&encoded)?;\n\nYAML und TOML (serde_yaml, toml)
\nWerden für Konfigurationsdateien verwendet. Für Menschen lesbar, unterstützen Kommentare (YAML).
\n\n// YAML\nlet yaml = serde_yaml::to_string(&data)?;\nlet data: MyStruct = serde_yaml::from_str(&yaml)?;\n\n// TOML (beliebt im Rust-Ökosystem)\nlet toml = toml::to_string(&data)?;\nlet data: MyStruct = toml::from_str(&toml)?;\n\nFortgeschrittene Möglichkeiten: Serde-Attribute
\n\nSerde bietet leistungsstarke Attribute zur Feinabstimmung der Serialisierung:
\n\n#[derive(Serialize, Deser Auch in der Bibliothek
Kryptographie in Node.js: Verschlüsselung und Hashing mit crypto
Jsoup Java: Vollständiges Tutorial mit Beispielen
Dependency Injection Container für JavaScript (Node.js) — Awilix
Caching in TypeScript: Redis, Memcached und In-Memory-Lösungen
Arbeit mit YAML in C++: Bibliotheken yaml-cpp und rapidyaml