{"id":587,"date":"2025-01-20T23:34:36","date_gmt":"2025-01-20T22:34:36","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=587"},"modified":"2025-02-28T23:37:04","modified_gmt":"2025-02-28T22:37:04","slug":"serialisierung-von-objekten-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=587","title":{"rendered":"Serialisierung von Objekten in Java"},"content":{"rendered":"\n<p>Die Serialisierung ist ein essenzielles Konzept in der Java-Programmierung, das die Umwandlung von Objekten in ein \u00fcbertragbares oder speicherbares Format erm\u00f6glicht. Dies ist insbesondere f\u00fcr verteilte Systeme, Datenbankpersistenz und Caching von Bedeutung. In diesem Artikel werden verschiedene Methoden zur Serialisierung in Java untersucht, darunter die Bordmittel des JDK sowie popul\u00e4re Drittanbieter-Bibliotheken. Zudem werden deren Vor- und Nachteile sowie Unterschiede detailliert betrachtet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Native Serialisierung mit Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Java Serializable-Schnittstelle<\/h3>\n\n\n\n<p>Java bietet mit der <code>Serializable<\/code>-Schnittstelle eine einfache M\u00f6glichkeit, Objekte zu serialisieren. Ein Objekt einer Klasse kann serialisiert werden, wenn die Klasse <code>java.io.Serializable<\/code> implementiert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import java.io.*;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Serializable<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> long serialVersionUID = <span class=\"hljs-number\">1<\/span>L;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-keyword\">private<\/span> int age;\n    \n    <span class=\"hljs-keyword\">public<\/span> Person(String name, int age) {\n        this.name = name;\n        this.age = age;\n    }\n    \n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String toString() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Person{name='\"<\/span> + name + <span class=\"hljs-string\">\"', age=\"<\/span> + age + <span class=\"hljs-string\">\"}\"<\/span>;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Serialisierung erfolgt dann \u00fcber <code>ObjectOutputStream<\/code>:<\/p>\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\"><span class=\"hljs-keyword\">try<\/span> (ObjectOutputStream out = <span class=\"hljs-keyword\">new<\/span> ObjectOutputStream(<span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"person.ser\"<\/span>))) {\n    out.writeObject(<span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-number\">30<\/span>));\n} <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n    e.printStackTrace();\n}\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<p>Zum Deserialisieren wird <code>ObjectInputStream<\/code> verwendet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">try<\/span> (ObjectInputStream <span class=\"hljs-keyword\">in<\/span> = <span class=\"hljs-keyword\">new<\/span> ObjectInputStream(<span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"person.ser\"<\/span>))) {\n    Person person = (Person) <span class=\"hljs-keyword\">in<\/span>.readObject();\n    System.out.println(person);\n} <span class=\"hljs-keyword\">catch<\/span> (IOException | ClassNotFoundException e) {\n    e.printStackTrace();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<h3 class=\"wp-block-heading\">1.2 Vorteile und Nachteile der nativen Java-Serialisierung<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einfache Nutzung<\/strong>: Keine zus\u00e4tzliche Bibliothek erforderlich.<\/li>\n\n\n\n<li><strong>Automatische Speicherung der Objekthierarchie<\/strong>: Vererbte Felder werden mitserialisiert.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nachteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Langsame Performance<\/strong>: Java-Serializable ist langsamer als moderne Serialisierungsmethoden.<\/li>\n\n\n\n<li><strong>Hoher Speicherverbrauch<\/strong>: Die serialisierten Objekte sind oft unn\u00f6tig gro\u00df.<\/li>\n\n\n\n<li><strong>Inkompatibilit\u00e4t bei \u00c4nderungen<\/strong>: \u00c4nderungen an der Klassenstruktur k\u00f6nnen zu <code>InvalidClassException<\/code> f\u00fchren.<\/li>\n\n\n\n<li><strong>Sicherheitsrisiken<\/strong>: Serialisierte Objekte sind anf\u00e4llig f\u00fcr Deserialisierungsangriffe.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Alternative Serialisierungsans\u00e4tze<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 JSON-Serialisierung mit Jackson<\/h3>\n\n\n\n<p>Jackson ist eine weit verbreitete Bibliothek zur JSON-Verarbeitung in Java. Sie ist einfach zu verwenden und effizient:<\/p>\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> com.fasterxml.jackson.databind.ObjectMapper;\n\nObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\nPerson person = <span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-number\">30<\/span>);\n<span class=\"hljs-built_in\">String<\/span> json = objectMapper.writeValueAsString(person);\nSystem.out.println(json);\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<p>Deserialisierung:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Person deserializedPerson = objectMapper.readValue(json, Person.class);\nSystem.out.println(deserializedPerson);\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Vorteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lesbares Format<\/strong>: JSON kann problemlos von Menschen und Systemen verarbeitet werden.<\/li>\n\n\n\n<li><strong>Plattformunabh\u00e4ngigkeit<\/strong>: JSON kann in verschiedenen Programmiersprachen genutzt werden.<\/li>\n\n\n\n<li><strong>Flexible Struktur<\/strong>: Es gibt keine feste Schema-Vorgabe.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nachteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gr\u00f6\u00dfer als bin\u00e4re Formate<\/strong>: JSON ben\u00f6tigt mehr Speicherplatz als bin\u00e4re Serialisierungsformate wie Protobuf oder Kryo.<\/li>\n\n\n\n<li><strong>Langsamer als bin\u00e4re Formate<\/strong>: Das Parsen von JSON ist langsamer als die Verarbeitung von bin\u00e4ren Formaten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Gson<\/h3>\n\n\n\n<p>Gson ist eine alternative Bibliothek von Google zur JSON-Serialisierung und -Deserialisierung:<\/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> com.google.gson.Gson;\n\nGson gson = <span class=\"hljs-keyword\">new<\/span> Gson();\n<span class=\"hljs-built_in\">String<\/span> json = gson.toJson(person);\nPerson personFromJson = gson.fromJson(json, Person.class);\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<h4 class=\"wp-block-heading\">Unterschiede zu Jackson:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einfachere API<\/strong>: Gson ist oft einfacher zu verwenden als Jackson.<\/li>\n\n\n\n<li><strong>Weniger flexibel<\/strong>: Jackson bietet mehr Anpassungsm\u00f6glichkeiten und schnellere Verarbeitung.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.3 Protobuf (Protocol Buffers)<\/h3>\n\n\n\n<p>Google\u2019s Protocol Buffers (Protobuf) ist ein bin\u00e4res Serialisierungsformat, das besonders f\u00fcr Hochleistungsanwendungen geeignet ist. Es erfordert eine spezielle <code>.proto<\/code>-Datei zur Definition der Datenstrukturen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">syntax = <span class=\"hljs-string\">\"proto3\"<\/span>;\nmessage Person {\n  string name = <span class=\"hljs-number\">1<\/span>;\n  int32 age = <span class=\"hljs-number\">2<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>Nach der Codegenerierung kann ein Protobuf-Objekt serialisiert werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PersonProto.Person person = PersonProto.Person.newBuilder().setName(<span class=\"hljs-string\">\"Alice\"<\/span>).setAge(<span class=\"hljs-number\">30<\/span>).build();\nbyte&#91;] serializedData = person.toByteArray();\nPersonProto.Person deserializedPerson = PersonProto.Person.parseFrom(serializedData);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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\">Vorteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hocheffizient<\/strong>: Kompaktes bin\u00e4res Format mit schneller Verarbeitung.<\/li>\n\n\n\n<li><strong>Versionskompatibel<\/strong>: \u00c4nderungen an der Struktur sind m\u00f6glich, solange neue Felder optional sind.<\/li>\n\n\n\n<li><strong>Plattform\u00fcbergreifend<\/strong>: Kann in verschiedenen Programmiersprachen verwendet werden.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nachteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zus\u00e4tzlicher Code-Generator erforderlich<\/strong>: <code>.proto<\/code>-Dateien m\u00fcssen vor der Nutzung kompiliert werden.<\/li>\n\n\n\n<li><strong>Nicht menschenlesbar<\/strong>: Erschwert Debugging im Vergleich zu JSON.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.4 Kryo<\/h3>\n\n\n\n<p>Kryo ist eine leistungsf\u00e4hige Bibliothek f\u00fcr bin\u00e4re Serialisierung mit hoher Performance und geringerem Speicherverbrauch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.esotericsoftware.kryo.Kryo;\n<span class=\"hljs-keyword\">import<\/span> com.esotericsoftware.kryo.io.Input;\n<span class=\"hljs-keyword\">import<\/span> com.esotericsoftware.kryo.io.Output;\n<span class=\"hljs-keyword\">import<\/span> java.io.*;\n\nKryo kryo = <span class=\"hljs-keyword\">new<\/span> Kryo();\nkryo.register(Person.class);\n\n<span class=\"hljs-keyword\">try<\/span> (Output output = <span class=\"hljs-keyword\">new<\/span> Output(<span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"person.kryo\"<\/span>))) {\n    kryo.writeObject(output, <span class=\"hljs-keyword\">new<\/span> Person(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-number\">30<\/span>));\n}\n\n<span class=\"hljs-keyword\">try<\/span> (Input input = <span class=\"hljs-keyword\">new<\/span> Input(<span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"person.kryo\"<\/span>))) {\n    Person person = kryo.readObject(input, Person.class);\n    System.out.println(person);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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\">Vorteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sehr hohe Geschwindigkeit<\/strong>: Schneller als die native Java-Serialisierung und JSON.<\/li>\n\n\n\n<li><strong>Geringe Dateigr\u00f6\u00dfe<\/strong>: Kompaktes bin\u00e4res Format.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Nachteile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nicht standardisiert<\/strong>: Kein plattform\u00fcbergreifendes Standardformat.<\/li>\n\n\n\n<li><strong>Nicht menschenlesbar<\/strong>: Debugging schwieriger als bei JSON.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Fazit<\/h2>\n\n\n\n<p>Die Wahl der richtigen Serialisierung h\u00e4ngt von den Anforderungen ab:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Java-Serializable<\/strong>: Einfach, aber ineffizient und unsicher.<\/li>\n\n\n\n<li><strong>JSON (Jackson, Gson)<\/strong>: Menschlich lesbar, aber gr\u00f6\u00dfer und langsamer als bin\u00e4re Formate.<\/li>\n\n\n\n<li><strong>Protobuf<\/strong>: Sehr effizient, aber erfordert zus\u00e4tzliche Code-Generierung.<\/li>\n\n\n\n<li><strong>Kryo<\/strong>: Extrem schnell, aber nicht standardisiert und nicht plattformunabh\u00e4ngig.<\/li>\n<\/ul>\n\n\n\n<p>F\u00fcr produktive Systeme ist es ratsam, von der nativen Java-Serialisierung auf eine effizientere L\u00f6sung wie Protobuf oder Kryo umzusteigen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Serialisierung ist ein essenzielles Konzept in der Java-Programmierung, das die Umwandlung von Objekten in ein \u00fcbertragbares oder speicherbares Format erm\u00f6glicht. Dies ist insbesondere f\u00fcr verteilte Systeme, Datenbankpersistenz und Caching von Bedeutung. In diesem Artikel werden verschiedene Methoden zur Serialisierung in Java untersucht, darunter die Bordmittel des JDK sowie popul\u00e4re Drittanbieter-Bibliotheken. Zudem werden deren Vor- [&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-587","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\/587","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=587"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/587\/revisions"}],"predecessor-version":[{"id":588,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/587\/revisions\/588"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}