Google Protocol Buffers (Protobuf): Unterschied zwischen den Versionen
PhilKa (Diskussion | Beiträge) Die Seite wurde neu angelegt: „= Google Protocol Buffers (Protobuf) = '''Google Protocol Buffers''' (kurz: '''Protobuf''') sind ein binäres, plattform- und sprachunabhängiges Datenserialisierungsformat, das von Google entwickelt wurde. Protobuf wird verwendet, um strukturierte Daten effizient zwischen Systemen auszutauschen oder dauerhaft zu speichern. Es ist besonders in verteilten Systemen, Microservices und Hochleistungsanwendungen verbreitet. == Ziel und Motivation == Protoco…“ |
PhilKa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 6: | Zeile 6: | ||
== Ziel und Motivation == | == Ziel und Motivation == | ||
Protocol Buffers wurden entwickelt, um: | Protocol Buffers wurden entwickelt, um: | ||
* | * ''Daten kompakt'' zu serialisieren (weniger Speicherbedarf als JSON/XML) | ||
* | * ''schnelle Verarbeitung'' zu ermöglichen (geringe CPU-Kosten) | ||
* | * ''stark typisierte, versionierbare Datenstrukturen'' bereitzustellen | ||
* | * ''Interoperabilität'' zwischen verschiedenen Programmiersprachen zu gewährleisten | ||
Im Gegensatz zu textbasierten Formaten wie XML oder JSON ist Protobuf | Im Gegensatz zu textbasierten Formaten wie XML oder JSON ist Protobuf ''binär'', was eine deutlich höhere Effizienz ermöglicht. | ||
== Grundprinzip == | == Grundprinzip == | ||
Datenstrukturen werden in einer | Datenstrukturen werden in einer ''.proto''-Datei definiert, aus der Protobuf automatisch Code für verschiedene Programmiersprachen generiert. | ||
Dieser Code enthält Klassen/Strukturen, die zur Serialisierung und Deserialisierung verwendet werden. | Dieser Code enthält Klassen/Strukturen, die zur Serialisierung und Deserialisierung verwendet werden. | ||
| Zeile 71: | Zeile 71: | ||
== Feldnummern und Versionierung == | == Feldnummern und Versionierung == | ||
Felder in Protobuf erhalten | Felder in Protobuf erhalten ''persistente Nummern'', damit Datenstrukturen ''versionierbar'' bleiben. | ||
Neue Felder können hinzugefügt werden, ohne alte Clients zu brechen. | Neue Felder können hinzugefügt werden, ohne alte Clients zu brechen. | ||
* | * ''Alte Clients'' ignorieren unbekannte Felder. | ||
* | * ''Neue Clients'' können zusätzliche Informationen verarbeiten. | ||
Dies macht Protobuf besonders geeignet für langlebige APIs. | Dies macht Protobuf besonders geeignet für langlebige APIs. | ||
| Zeile 82: | Zeile 82: | ||
Protobuf kodiert Daten in einem kompakten binären Format. | Protobuf kodiert Daten in einem kompakten binären Format. | ||
Typische Kodierungstechniken: | Typische Kodierungstechniken: | ||
* | * ''Varint'' (variable Länge) zur effizienten Speicherung kleiner Zahlen | ||
* | * ''Fixed32 / Fixed64'' für feste Zahlenformate | ||
* | * ''Length-delimited'' für Strings und verschachtelte Nachrichten | ||
== Protobuf vs. JSON vs. XML == | == Protobuf vs. JSON vs. XML == | ||
| Zeile 104: | Zeile 104: | ||
== Protobuf und gRPC == | == Protobuf und gRPC == | ||
Protobuf ist das Standard-Datenformat für den RPC-Framework | Protobuf ist das Standard-Datenformat für den RPC-Framework ''gRPC''. | ||
Dabei können | Dabei können ''Remote Procedure Calls'' zwischen verteilten Services effizient abgewickelt werden. | ||
Beispiel | Beispiel ''Service-Definition'' in einer `.proto`-Datei: | ||
<syntaxhighlight lang="proto"> | <syntaxhighlight lang="proto"> | ||
service PersonService { | service PersonService { | ||
| Zeile 137: | Zeile 137: | ||
* Datenstrukturen werden in `.proto`-Dateien definiert. | * Datenstrukturen werden in `.proto`-Dateien definiert. | ||
* Geeignet für leistungsfähige, skalierbare Systeme, insbesondere in verteilten Umgebungen. | * Geeignet für leistungsfähige, skalierbare Systeme, insbesondere in verteilten Umgebungen. | ||
* Häufig in Kombination mit | * Häufig in Kombination mit ''gRPC'' eingesetzt. | ||
== Siehe auch == | == Siehe auch == | ||
Aktuelle Version vom 8. November 2025, 14:02 Uhr
Google Protocol Buffers (Protobuf)
Google Protocol Buffers (kurz: Protobuf) sind ein binäres, plattform- und sprachunabhängiges Datenserialisierungsformat, das von Google entwickelt wurde. Protobuf wird verwendet, um strukturierte Daten effizient zwischen Systemen auszutauschen oder dauerhaft zu speichern. Es ist besonders in verteilten Systemen, Microservices und Hochleistungsanwendungen verbreitet.
Ziel und Motivation
Protocol Buffers wurden entwickelt, um:
- Daten kompakt zu serialisieren (weniger Speicherbedarf als JSON/XML)
- schnelle Verarbeitung zu ermöglichen (geringe CPU-Kosten)
- stark typisierte, versionierbare Datenstrukturen bereitzustellen
- Interoperabilität zwischen verschiedenen Programmiersprachen zu gewährleisten
Im Gegensatz zu textbasierten Formaten wie XML oder JSON ist Protobuf binär, was eine deutlich höhere Effizienz ermöglicht.
Grundprinzip
Datenstrukturen werden in einer .proto-Datei definiert, aus der Protobuf automatisch Code für verschiedene Programmiersprachen generiert. Dieser Code enthält Klassen/Strukturen, die zur Serialisierung und Deserialisierung verwendet werden.
Beispiel: .proto-Datei
syntax = "proto3";
message Person {
string name = 1;
int32 alter = 2;
repeated string interessen = 3;
}
Bedeutung:
- `message` definiert eine Datenstruktur
- Felder werden durchnummeriert, um Rückwärtskompatibilität zu gewährleisten
- `repeated` bedeutet: Liste/Array
Codegenerierung
Protobuf verwendet den Compiler `protoc`, um aus .proto-Dateien Quellcode zu erzeugen.
Beispiel (Codegenerierung für C++):
protoc --cpp_out=. person.proto
Unterstützte Sprachen u. a.:
- C++
- Java
- Python
- C#
- Go
- Rust (Community)
- JavaScript / TypeScript
Serialisierung und Deserialisierung
Die generierten Klassen bieten standardisierte Methoden:
Beispiel in Python
import person_pb2
person = person_pb2.Person()
person.name = "Alice"
person.alter = 30
person.interessen.append("Musik")
# Serialisieren
data = person.SerializeToString()
# Deserialisieren
person2 = person_pb2.Person()
person2.ParseFromString(data)
Feldnummern und Versionierung
Felder in Protobuf erhalten persistente Nummern, damit Datenstrukturen versionierbar bleiben. Neue Felder können hinzugefügt werden, ohne alte Clients zu brechen.
- Alte Clients ignorieren unbekannte Felder.
- Neue Clients können zusätzliche Informationen verarbeiten.
Dies macht Protobuf besonders geeignet für langlebige APIs.
Wire Format (Binärformat)
Protobuf kodiert Daten in einem kompakten binären Format. Typische Kodierungstechniken:
- Varint (variable Länge) zur effizienten Speicherung kleiner Zahlen
- Fixed32 / Fixed64 für feste Zahlenformate
- Length-delimited für Strings und verschachtelte Nachrichten
Protobuf vs. JSON vs. XML
| Eigenschaft | Protobuf | JSON | XML |
|---|---|---|---|
| Format | Binär | Text | Text |
| Lesbarkeit für Menschen | gering | gut | gut |
| Größe | sehr klein | mittel | groß |
| Geschwindigkeit | sehr hoch | hoch | niedrig |
| Typisierung | stark typisiert | dynamisch | flexibel, aber komplex |
| Schema-Versionierung | sehr gut | eingeschränkt | gut (XSD) |
Protobuf und gRPC
Protobuf ist das Standard-Datenformat für den RPC-Framework gRPC. Dabei können Remote Procedure Calls zwischen verteilten Services effizient abgewickelt werden.
Beispiel Service-Definition in einer `.proto`-Datei:
service PersonService {
rpc GetPerson (PersonRequest) returns (Person);
}
Vorteile
- Sehr kleines, effizientes Format
- Hohe Performance bei Serialisierung/Deserialisierung
- Starke Typisierung und gute Versionierbarkeit
- Große Sprach- und Plattformunterstützung
- Ideal für Microservices und Netzwerkkommunikation
Nachteile
- Weniger menschenlesbar als JSON oder XML
- Schema notwendig (aber stabil und versionierbar)
- Nicht ideal für Konfigurationsdateien oder Ad-hoc-Debugging
Anwendungsgebiete
- Microservices-Architekturen (insb. mit gRPC)
- Cloud-Services und Backend-APIs
- Mobile Anwendungen und IoT
- Datenspeicherung in binären Formaten
- Hochfrequenz- und Streaming-Systeme
Zusammenfassung
- Protobuf ist ein effizientes, binäres Datenformat zur Serialisierung strukturierter Daten.
- Datenstrukturen werden in `.proto`-Dateien definiert.
- Geeignet für leistungsfähige, skalierbare Systeme, insbesondere in verteilten Umgebungen.
- Häufig in Kombination mit gRPC eingesetzt.