{"id":421,"date":"2024-05-30T21:59:34","date_gmt":"2024-05-30T20:59:34","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=421"},"modified":"2024-06-26T22:00:08","modified_gmt":"2024-06-26T21:00:08","slug":"einfuehrung-in-protobuf-fuer-java-entwickler","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=421","title":{"rendered":"Einf\u00fchrung in Protobuf f\u00fcr Java-Entwickler"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Was ist Protobuf?<\/h2>\n\n\n\n<p>Protocol Buffers, oft als Protobuf abgek\u00fcrzt, ist ein von Google entwickeltes Serialisierungsprotokoll, das f\u00fcr die effiziente und plattformunabh\u00e4ngige Strukturierung von Daten verwendet wird. Protobuf bietet eine kompakte und leistungsstarke Methode zur Serialisierung strukturierter Daten, die in der Regel effizienter als XML oder JSON ist. Es wird h\u00e4ufig f\u00fcr die Kommunikation zwischen Diensten in verteilten Systemen verwendet, insbesondere in Mikrodienst-Architekturen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundprinzipien von Protobuf<\/h2>\n\n\n\n<p>Protobuf basiert auf der Definition von Datenstrukturen in <code>.proto<\/code>-Dateien, die dann in verschiedene Programmiersprachen kompiliert werden k\u00f6nnen. Diese Dateien definieren Nachrichten (Messages), die die Datenstrukturen beschreiben. Jede Nachricht besteht aus Feldern, die einen Namen, einen Typ und eine eindeutige Nummer haben, die zur Identifikation w\u00e4hrend der Serialisierung und Deserialisierung verwendet wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel einer <code>.proto<\/code>-Datei<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">syntax = <span class=\"hljs-string\">\"proto3\"<\/span>;\n\nmessage Person {\n    string name = <span class=\"hljs-number\">1<\/span>;\n    int32 id = <span class=\"hljs-number\">2<\/span>;\n    string email = <span class=\"hljs-number\">3<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel definieren wir eine Nachricht <code>Person<\/code> mit drei Feldern: <code>name<\/code>, <code>id<\/code> und <code>email<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einrichtung und Verwendung von Protobuf in Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Voraussetzungen<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Protobuf Compiler (<code>protoc<\/code>)<\/strong>: Zum Kompilieren der <code>.proto<\/code>-Dateien in Java-Klassen.<\/li>\n\n\n\n<li><strong>Protobuf Java Runtime<\/strong>: Die Laufzeitbibliothek, die f\u00fcr die Serialisierung und Deserialisierung ben\u00f6tigt wird.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt-f\u00fcr-Schritt-Anleitung<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Installation des Protobuf Compilers<\/strong> Der Protobuf Compiler kann von der offiziellen <a href=\"https:\/\/github.com\/protocolbuffers\/protobuf\/releases\">GitHub-Seite<\/a> heruntergeladen werden. Nach der Installation sollte der Compiler \u00fcber den Befehl <code>protoc<\/code> im Terminal verf\u00fcgbar sein.<\/li>\n\n\n\n<li><strong>Erstellung der <code>.proto<\/code>-Datei<\/strong> Erstellen Sie eine Datei namens <code>person.proto<\/code> mit dem folgenden Inhalt:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   syntax = <span class=\"hljs-string\">\"proto3\"<\/span>;\n\n   message Person {\n       string name = <span class=\"hljs-number\">1<\/span>;\n       int32 id = <span class=\"hljs-number\">2<\/span>;\n       string email = <span class=\"hljs-number\">3<\/span>;\n   }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Kompilieren der <code>.proto<\/code>-Datei<\/strong> Kompilieren Sie die <code>.proto<\/code>-Datei mit dem folgenden Befehl:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">   protoc --java_out=. person.proto<\/code><\/span><\/pre>\n\n\n<p>Dieser Befehl generiert eine Java-Klasse <code>Person.java<\/code> im aktuellen Verzeichnis.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li><strong>Einbindung in das Java-Projekt<\/strong> F\u00fcgen Sie die generierte Java-Klasse sowie die Protobuf Java Runtime-Bibliothek zu Ihrem Projekt hinzu. Wenn Sie Maven verwenden, k\u00f6nnen Sie die Abh\u00e4ngigkeit in Ihrer <code>pom.xml<\/code> hinzuf\u00fcgen:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n       <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.google.protobuf<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n       <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>protobuf-java<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n       <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>3.19.1<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n   <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Nutzung der generierten Java-Klassen<\/h3>\n\n\n\n<p>Nachdem die <code>.proto<\/code>-Datei kompiliert und die Abh\u00e4ngigkeiten hinzugef\u00fcgt wurden, k\u00f6nnen Sie die generierten Klassen verwenden, um Nachrichten zu erstellen, zu serialisieren und zu deserialisieren.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Erstellen einer <code>Person<\/code>-Nachricht<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> example.protobuf.Person;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-comment\">\/\/ Erstellen einer Person-Nachricht<\/span>\n        Person person = Person.newBuilder()\n                              .setName(<span class=\"hljs-string\">\"Max Mustermann\"<\/span>)\n                              .setId(<span class=\"hljs-number\">1234<\/span>)\n                              .setEmail(<span class=\"hljs-string\">\"max@mustermann.de\"<\/span>)\n                              .build();\n\n        System.out.println(<span class=\"hljs-string\">\"Person erstellt: \"<\/span> + person);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Serialisieren und Deserialisieren<\/h4>\n\n\n\n<p>Eine der Hauptst\u00e4rken von Protobuf ist die effiziente Serialisierung und Deserialisierung von Nachrichten. Hier ist ein Beispiel, wie dies in Java durchgef\u00fchrt wird:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> example.protobuf.Person;\n<span class=\"hljs-keyword\">import<\/span> java.io.FileInputStream;\n<span class=\"hljs-keyword\">import<\/span> java.io.FileOutputStream;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-comment\">\/\/ Erstellen einer Person-Nachricht<\/span>\n            Person person = Person.newBuilder()\n                                  .setName(<span class=\"hljs-string\">\"Max Mustermann\"<\/span>)\n                                  .setId(<span class=\"hljs-number\">1234<\/span>)\n                                  .setEmail(<span class=\"hljs-string\">\"max@mustermann.de\"<\/span>)\n                                  .build();\n\n            <span class=\"hljs-comment\">\/\/ Serialisieren in eine Datei<\/span>\n            FileOutputStream output = <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"person.ser\"<\/span>);\n            person.writeTo(output);\n            output.close();\n\n            <span class=\"hljs-comment\">\/\/ Deserialisieren aus einer Datei<\/span>\n            FileInputStream input = <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"person.ser\"<\/span>);\n            Person deserializedPerson = Person.parseFrom(input);\n            input.close();\n\n            System.out.println(<span class=\"hljs-string\">\"Deserialisierte Person: \"<\/span> + deserializedPerson);\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird eine <code>Person<\/code>-Nachricht erstellt und in eine Datei serialisiert. Anschlie\u00dfend wird die Nachricht aus der Datei gelesen und deserialisiert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorteile von Protobuf<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Effizienz<\/strong>: Protobuf ist \u00e4u\u00dferst platzsparend und bietet eine hohe Leistung bei der Serialisierung und Deserialisierung.<\/li>\n\n\n\n<li><strong>Spracheunabh\u00e4ngigkeit<\/strong>: Durch die Unterst\u00fctzung mehrerer Programmiersprachen ist Protobuf ideal f\u00fcr heterogene Umgebungen.<\/li>\n\n\n\n<li><strong>Schema-Validierung<\/strong>: Protobuf stellt sicher, dass die Daten den definierten Schemata entsprechen, was die Datenintegrit\u00e4t erh\u00f6ht.<\/li>\n\n\n\n<li><strong>Vorw\u00e4rts- und R\u00fcckw\u00e4rtskompatibilit\u00e4t<\/strong>: Durch die Verwendung von Feldnummern und optionale Felder k\u00f6nnen Protobuf-Schemata einfach erweitert werden, ohne die Kompatibilit\u00e4t zu brechen.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Protocol Buffers bieten eine leistungsf\u00e4hige und effiziente Methode zur Serialisierung und Deserialisierung strukturierter Daten. Durch die Nutzung von <code>.proto<\/code>-Dateien zur Definition von Nachrichtenstrukturen und der F\u00e4higkeit, in verschiedene Programmiersprachen zu kompilieren, bietet Protobuf eine flexible L\u00f6sung f\u00fcr die Datenkommunikation in verteilten Systemen. Die Integration in Java-Projekte ist durch die bereitgestellten Tools und Bibliotheken einfach und gut dokumentiert. Mit Protobuf k\u00f6nnen Entwickler die Leistung und Effizienz ihrer Anwendungen erheblich steigern, insbesondere in Szenarien mit hohen Anforderungen an die Daten\u00fcbertragung und -verarbeitung.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist Protobuf? Protocol Buffers, oft als Protobuf abgek\u00fcrzt, ist ein von Google entwickeltes Serialisierungsprotokoll, das f\u00fcr die effiziente und plattformunabh\u00e4ngige Strukturierung von Daten verwendet wird. Protobuf bietet eine kompakte und leistungsstarke Methode zur Serialisierung strukturierter Daten, die in der Regel effizienter als XML oder JSON ist. Es wird h\u00e4ufig f\u00fcr die Kommunikation zwischen Diensten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-421","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=421"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/421\/revisions"}],"predecessor-version":[{"id":422,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/421\/revisions\/422"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}