Prost für Rust: Komplettes Tutorial mit Beispielen

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

Was ist Prost und warum wird es benötigt?

Prost ist eine leistungsstarke und effiziente Bibliothek für die Programmiersprache Rust, die für die Arbeit mit Protocol Buffers (protobuf) entwickelt wurde. Protocol Buffers ist ein von Google entwickelter Mechanismus zur Serialisierung strukturierter Daten, der im Vergleich zu JSON oder XML kompakter und schneller ist.

Prost löst mehrere zentrale Aufgaben:

  • Code-Generierung: Erstellt automatisch Rust-Strukturen aus .proto-Dateien und erspart dem Entwickler so mühsame Handarbeit.
  • Serialisierung und Deserialisierung: Wandelt Daten aus dem binären Protobuf-Format in Rust-Strukturen um und zurück.
  • Hohe Leistung: Nutzt Zero-Copy und effizientes Speichermanagement, was es zu einer der schnellsten Lösungen für Protobuf in Rust macht.
  • Sicherheit: Vollständig in Rust geschrieben, was Speicher- und Thread-Sicherheit garantiert.

Die Bibliothek ist besonders nützlich in Microservice-Architekturen, Datenaustauschsystemen zwischen Diensten, Konfigurationsspeicherung und allen Szenarien, die eine effiziente Serialisierung erfordern.

Installation

Prost wird über den Paketmanager Cargo installiert. Fügen Sie folgende Abhängigkeiten zu Ihrer Cargo.toml hinzu:

[dependencies]
prost = "0.12"
prost-build = "0.12"
tonic = "0.11"  # optional, für gRPC
bytes = "1.5"   # für die Arbeit mit Puffern

[build-dependencies]
prost-build = "0.12"

Außerdem benötigen Sie den Protobuf-Compiler (protoc). Unter Ubuntu/Debian:

sudo apt install protobuf-compiler

Unter macOS:

brew install protobuf

Unter Windows laden Sie das Binary aus dem offiziellen Protobuf-Repository herunter und fügen es zum PATH hinzu.

Schnellstart

Erstellen Sie eine Datei person.proto:

syntax = "proto3";

message Person {
    string name = 1;
    int32 age = 2;
    repeated string phone_numbers = 3;
}

Erstellen Sie build.rs im Projektverzeichnis:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    prost_build::compile_protos(&["src/person.proto"], &["src/"])?;
    Ok(())
}

Jetzt in main.rs:

use prost::Message;

// Der generierte Code befindet sich im Modul person
pub mod person {
    include!(concat!(env!("OUT_DIR"), "/person.rs"));
}

fn main() {
    // Objekt erstellen
    let person = person::Person {
        name: "Max Mustermann".to_string(),
        age: 30,
        phone_numbers: vec!["+49-123-456-789".to_string()],
    };

    // In Bytes serialisieren
    let mut buf = Vec::new();
    person.encode(&mut buf).unwrap();
    println!("Serialisiert: {} Bytes", buf.len());

    // Zurück deserialisieren
    let decoded = person::Person::decode(&buf[..]).unwrap();
    println!("Name: {}, Alter: {}", decoded.name, decoded.age);
}

Wichtige Methoden und Funktionen

1. Message::encode

Funktion: Serialisiert eine Nachricht in das binäre Protobuf-Format und schreibt sie in einen Puffer.

Parameter:

  • &self — Referenz auf die Nachricht
  • buf: &mut impl BufMut — Puffer zum Schreiben (normalerweise Vec<u8>)

Beispiel:

let mut buf = Vec::new();
my_message.encode(&mut buf).unwrap();

2. Message::decode

Funktion: Deserialisiert Bytes zurück in eine Rust-Struktur.

Parameter:

  • buf: impl Buf — Byte-Quelle (Slice, Vec, Bytes)

Beispiel:

let decoded = MyMessage::decode(&buf[..]).unwrap();

3. Message::encod

Empfehlungen