Google Protocol Buffers (Protobuf)

Aus dev.kaibel.net
Version vom 8. November 2025, 14:02 Uhr von PhilKa (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.

Siehe auch

Weblinks