Was sind Protocol Buffers (protobuf) und warum braucht man sie?
Protocol Buffers (protobuf) sind ein leistungsstarker, effizienter und erweiterbarer Mechanismus zur Serialisierung strukturierter Daten, entwickelt von Google. Sie definieren die Datenstruktur einmal in einer speziellen Datei (.proto) und generieren dann Quellcode für verschiedene Programmiersprachen (C++, Java, Python, Go u.a.) zum Lesen und Schreiben dieser Daten.
Warum protobuf verwenden?
- Effizienz: Protobuf serialisiert Daten in ein binäres Format, das deutlich kompakter und schneller zu verarbeiten ist als textbasierte Formate wie XML oder JSON. Das ist besonders wichtig für hochlastige Systeme und Microservices.
- Geschwindigkeit: Serialisierung und Deserialisierung sind um ein Vielfaches schneller als bei herkömmlichen Textformaten.
- Typsicherheit: Der generierte Code erzwingt eine strenge Typisierung, was Laufzeitfehler reduziert.
- Plattformunabhängigkeit und Mehrsprachigkeit: Einmal definiert, kann das Datenschema in C++, Python, Java und anderen Sprachen genutzt werden.
- Abwärtskompatibilität: Protobuf unterstützt die Weiterentwicklung des Datenschemas: Neue Felder können hinzugefügt werden, ohne alte Anwendungsversionen zu beschädigen.
Installation von protobuf für C++
Um protobuf in C++ zu nutzen, müssen zwei Komponenten installiert werden: der Compiler protoc (wandelt .proto-Dateien in C++-Code um) und die protobuf-Bibliothek für C++.
1. Installation des Compilers protoc
Der einfachste Weg ist der Download eines vorkompilierten Binärpakets von der offiziellen GitHub-Release-Seite von protobuf.
# Beispiel für Linux (Ubuntu/Debian)
sudo apt-get install protobuf-compiler
# Beispiel für macOS (über Homebrew)
brew install protobuf
# Für Windows: protoc-x.x.x-win64.zip herunterladen und den Pfad zu protoc.exe in die Umgebungsvariable PATH aufnehmen
2. Installation der protobuf-Bibliothek für C++
Es wird empfohlen, die Bibliothek aus dem Quellcode zu bauen oder einen Paketmanager zu verwenden.
# Ubuntu/Debian
sudo apt-get install libprotobuf-dev
# macOS (Homebrew)
brew install protobuf
# Bau aus dem Quellcode (universelle Methode)
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -Dprotobuf_BUILD_TESTS=OFF ..
make -j$(nproc)
sudo make install
3. CMake-Projekt konfigurieren (empfohlen)
Fügen Sie Folgendes in Ihre CMakeLists.txt ein:
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
# Automatische Kompilierung der .proto-Dateien
file(GLOB PROTO_FILES "*.proto")
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})
add_executable(my_program main.cpp ${PROTO_SRCS})
target_link_libraries(my_program ${Protobuf_LIBRARIES})
Schnellstart mit einem Code-Beispiel
Erstellen wir ein einfaches Beispiel, um die Grundlagen zu demonstrieren. Wir definieren eine Datenstruktur für einen Kontakt.
Schritt 1: .proto-Datei erstellen
Datei contact.proto:
syntax = "proto3";
package tutorial;
message Person {
string name = 1;
int32 age = 2;
string email = 3;
}
Schritt 2: C++-Code generieren
protoc --cpp_out=. contact.proto
Nach der Ausführung erscheinen die Dateien contact.pb.h und contact.pb.cc.
Schritt 3: C++-Code schreiben
Datei main.cpp:
#include <iostream>
#include <fstream>
#include "contact.pb.h"
using namespace std;
int main() {
// Sicherstellen, dass die Bibliothek initialisiert ist
GOOGLE_PROTOBUF_VERIFY_VERSION;
// 1. Person-Objekt erstellen und befüllen
tutorial::Person per