Protocol Buffers (kurz Protobuf) ist Googles sprachneutraler, plattformneutraler Mechanismus zur Serialisierung strukturierter Daten — offiziell beschrieben als „think XML, but smaller, faster, and simpler“. Die Schnittstelle wird in .proto-Dateien definiert, der Compiler protoc erzeugt daraus Code in vielen Programmiersprachen.

Die .proto-Datei

Eine Message besteht aus benannten Feldern, die jeweils eine Feldnummer (Tag) tragen. Die Feldnummern sind Teil des Wire-Formats und dürfen später nicht mehr geändert werden:

syntax = "proto3";
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 results_per_page = 3;
}

Neben proto3 existiert noch das ältere proto2; seit 2023 ergänzen Editions die Syntax. Scalare Typen sind string, int32, int64, bool, double, bytes und mehr; verschachtelte Messages, enum, oneof und map erweitern den Sprachumfang.

protoc: der Compiler

protoc ist der Protocol-Buffer-Compiler. Er liest eine oder mehrere .proto-Dateien und erzeugt je Zielsprache Quelldateien:

# Python-Code aus foo.proto erzeugen
protoc --proto_path=src --python_out=build/gen src/foo.proto

# Java und Go parallel
protoc --proto_path=src --java_out=build/java --go_out=build/go src/foo.proto

Wichtige Optionen: --proto_path (bzw. -I) setzt die Import-Basis, --*_out das Ausgabeverzeichnis je Sprache (--cpp_out, --java_out, --python_out, --go_out, --ruby_out, --csharp_out …). Sprach-Plugins wie protoc-gen-go oder protoc-gen-go-grpc müssen im PATH liegen; --descriptor_set_out mit --include_imports exportiert die komplette Datei-Beschreibung als binäres FileDescriptorSet.

Wire-Format und Praxis

Auf dem Draht werden Felder kompakt als Tag-Wert-Paare kodiert, Zahlen als Varint (variable Länge, kleine Werte brauchen nur 1 Byte). Dadurch sind Protobuf-Nachrichten deutlich kleiner als XML oder JSON. Ein Feld kann mit optional markiert werden; in proto3 sind Felder per Default „presence“-los. Ergänzend regelt option go_package = "example.com/proj/gen;gen" die Go-Import-Pfade.

Verwandte Grundlagen: YAML/TOML/JSON-Befehle (textuelle Alternativen), Go-Befehle und Python-Befehle für den Einsatz des generierten Codes. Im direkten Vergleich mit Thrift ist Protobuf reine Serialisierung — RPC kommt bei Google über gRPC, das Protobuf als IDL verwendet. Für den zerstörungsfreien Direktzugriff auf serialisierte Daten gibt es FlatBuffers.