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.