Serialisierung von Objekten in Rust: Serde und andere Werkzeuge

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Serialisierung von Objekten in Rust: Überblick über Bibliotheken und Werkzeuge

\n\n

Serialisierung 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\n

In 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\n

Warum Serde?

\n\n

Serde 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
\n\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.

\n\n

Einbindung und grundlegende Einrichtung

\n\n

Fügen Sie zunächst die folgenden Abhängigkeiten zu Ihrer Cargo.toml hinzu:

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

Die entscheidende Besonderheit ist die Verwendung des Attributs #[derive(Serialize, Deserialize)]. Es generiert automatisch den Code zur Umwandlung Ihrer Strukturen:

\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: "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\n

Arbeiten mit verschiedenen Formaten

\n\n

Serde unterstützt Dutzende von Formaten. Betrachten wir die gängigsten:

\n\n

JSON (serde_json)

\n

Das 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\n

Bincode (bincode)

\n

Ein 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\n

YAML und TOML (serde_yaml, toml)

\n

Werden 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\n

Fortgeschrittene Möglichkeiten: Serde-Attribute

\n\n

Serde bietet leistungsstarke Attribute zur Feinabstimmung der Serialisierung:

\n\n
#[derive(Serialize, Deser                    

Empfehlungen