Die Übertragung von Daten spielt in der Softwareentwicklung eine wichtige Rolle, besonders wenn es um die Kommunikation zwischen Systemen geht. Hierfür werden meistens Serialisierungsformate wie JSON oder XML verwendet. Neben diesen beiden Formaten gibt es Protocol Buffers, die von Google für die Kommunikation zwischen Servern entwickelt wurden und ein binäres Serialisierungsformat bieten. In diesem Blogartikel wird beleuchtet, was Protocol Buffers sind und warum sie eine Alternative zu JSON darstellen.
Protocol Buffers sind ein sprachunabhängiger, plattformneutraler und erweiterbarer Mechanismus zur strukturellen Serialisierung von Daten. Sie werden von Google in internen Umgebungen verwendet, in denen Performance und Ressourceneffizienz entscheidend sind.
Die Idee hinter Protocol Buffers ist die Verwendung von kompakten, nummerierten Binärdateien anstelle von textbasierten Dateiformaten. Es wird ein Dateischema in einer Proto-Datei (.proto) definiert, in welcher jeder Datenstruktur ein einzigartiges Tag zugeordnet wird. Mithilfe dieser Tags werden die Felder der binären Datei identifiziert.
In diesem Beispiel definieren wir eine Person mit 4 Feldern (name, id, email, phones) sowie eine Telefonnummer (PhoneNumber) mit 2 Feldern (number, type) und einem Enum (PhoneType). Jedes Feld bekommt eine eindeutige Nummer, da diese in der binären Datei anstelle der Feldnamen verwendet wird.
1// person.proto:
2syntax = "proto3";
3
4message Person {
5 string name = 1;
6 int32 id = 2;
7 string email = 3;
8
9 enum PhoneType {
10 MOBILE = 0;
11 HOME = 1;
12 WORK = 2;
13 }
14
15 message PhoneNumber {
16 string number = 1;
17 PhoneType type = 2;
18 }
19
20 repeated PhoneNumber phones = 4;
21}
Um aus der Proto-Datei eine Klasse zu erstellen, muss der Protocol Buffer Compiler für die gewünschte Sprache heruntergeladen und installiert werden.
Für unser Beispiel benutzen wir den Compiler für C# und das NuGet-Paket „Google.Protobuf“.
Nachdem der Compiler eingerichtet ist, können wir mit dem folgenden Befehl eine Klasse generieren lassen:
1protoc --csharp_out=./ person.proto
Zur Serialisierung wird die ToByteArray()
-Methode aus Google.Protobuf verwendet.
1//Object to be serialized
2 var person = new Person
3 {
4 Name = "John Doe",
5 Id = 1234,
6 Email = "JohnDoe@gmail.com"
7 };
8 //nested object
9 person.Phones.Add(new Person.Types.PhoneNumber
10 {
11 Number = "123-456-7890",
12 Type = Person.Types.PhoneType.Home
13 });
14
15 //Serialize the object
16 byte[] data = person.ToByteArray();
Für die Deserialisierung nutzen wir den generierten Parser.
1//Deserialize the object
2Person deserializedPerson = Person.Parser.ParseFrom(data);
3
4Console.WriteLine($"Name: {deserializedPerson.Name}");
5Console.WriteLine($"ID: {deserializedPerson.Id}");
6Console.WriteLine($"Email: {deserializedPerson.Email}");
7
8for (int i = 0; i < deserializedPerson.Phones.Count; i++)
9{
10 Console.WriteLine("Phones:");
11 var phone = deserializedPerson.Phones[i];
12 Console.WriteLine($"Phone Number {i}: {phone.Number}");
13 Console.WriteLine($"Phone Type {i}: {phone.Type}");
14}
Protocol Buffers sind im Gegensatz zu JSON stark typisiert und basieren auf einer vordefinierten Proto-Datei, die das Datenmodell beschreibt. JSON bietet hier mehr Flexibilität, während Protocol Buffers mehr Typ-Sicherheit bieten.
1//JSON Beispiel
2{
3 "Name": "John Doe",
4 "Id": "1234",
5 "Email": "JohnDoe@gmail.com",
6 "Phones": [
7 {
8 "Number": "123-456-7890",
9 "PhoneType":1
10 }
11 ]
12}
Protocol Buffers sind als binäres Format kompakter und schneller in der Serialisierung. JSON ist hingegen leichter zu lesen und zu verstehen.
JSON ist vor allem in Webanwendungen und APIs weit verbreitet, während Protocol Buffers häufig in ressourcenintensiven internen Systemen, Microservices oder mobilen Apps verwendet werden.
Protocol Buffers können durch ihren Compiler und die Verwendung spezieller Bibliotheken in vielen Programmiersprachen eingesetzt werden. JSON wird in praktisch allen modernen Programmiersprachen unterstützt.
Protocol Buffers bieten eine typisierte und schnellere Lösung zur Datenübertragung als JSON. Bei Webanwendungen ist jedoch weiterhin die Nutzung von JSON zu empfehlen, da dieses Format flexibler, verständlicher und weit verbreitet ist.