Serialisierung in Java: Alles, was Sie wissen müssen [2022]

Veröffentlicht: 2021-01-04

Mit dem ständig zunehmenden Boom der IT-Branche scheint unsere Abhängigkeit von ihr mit jedem Tag zu wachsen. Dieses stetige Wachstum hat viele Berufstätige dazu veranlasst, sich mit Programmiersprachen zu beschäftigen, um in der Branche relevant zu bleiben. Während die Branche mehrere Sprachen verwendet, um ihre Kunden zu bedienen, werden einige Sprachen häufiger verwendet als andere. Java ist eine solche Sprache.

Unabhängig davon, ob Sie ein Neuling oder ein Veteran sind, werden Ihnen fundierte Java-Kenntnisse auf Ihrer Softwarereise auf Schritt und Tritt zugute kommen. Wie jede andere Programmiersprache enthält auch Java einen eigenen umfassenden Lehrplan. Man muss die Sprache täglich üben, um all die verschiedenen Konzepte zu verstehen, die die Sprache unterstreichen. Ein solches Konzept, das Benutzern sehr hilft, ist die Praxis der Serialisierung in Java.

Inhaltsverzeichnis

Einführung

Serialisierung im Zusammenhang mit Java bezeichnet den Vorgang, bei dem ein Java-Code-Objekt systematisch in einen Byte-Stream umgewandelt wird. Dies geschieht, um die effiziente Übertragung des Objektcodes von einer virtuellen Java-Maschine zu einer anderen zu ermöglichen. Anschließend ermöglicht dies seine Wiederherstellung mit Hilfe der Deserialisierung. Wir verwenden Serialisierung, um mehrere Ziele zu erreichen. Werfen wir einen Blick auf die beliebtesten und relevantesten im Abschnitt unten.

Warum wird Serialisierung verwendet?

Das Phänomen, ein Objekt als Folge von Bytes darzustellen, wird innerhalb des Programmierparadigmas häufig verwendet. Wenn sich der Prozess auch auf die Darstellung der Daten des Objekts ausdehnt, erhöht sich der Nutzen um ein Vielfaches. Nachfolgend sind einige der häufigsten Verwendungen der Serialisierung in Java aufgeführt.

Kommunikation

Die Serialisierung in Java ermöglicht eine effektive und schnelle Kommunikation zwischen mehreren Computersystemen. Diese Einheiten verwenden Objektserialisierung und -übertragung, um die gleichzeitige gemeinsame Nutzung und Gestaltung verschiedener Objekte zu erleichtern. Folglich führt dies auch zu einer reibungslosen Ausführung. Im Falle umfangreicher Datenbanken ermöglicht die Serialisierung einen stark optimierten Ansatz für die Objektbehandlung.

Caching

Caching im weiteren Sinne bezieht sich auf die Methode, Informationen zu speichern, um zu einem späteren Zeitpunkt darauf zuzugreifen, indem nur minimal Zeit dafür investiert wird. Die Serialisierung in Java fordert das Caching auf, indem der Zeitaufwand für die Deserialisierung eines großen Objekts minimiert wird. Es ist allgemein bekannt, dass die Zeit, die zum Erstellen eines Objekts benötigt wird, viel länger ist als die Zeit, die für die Deserialisierung benötigt wird. Daher hilft die Serialisierung bei der Optimierung dieses Zeitverbrauchs, indem die relativ größeren Objekte in der Mischung zwischengespeichert werden.

Tiefe Kopie

Deep Copy in Java bezieht sich auf den Vorgang des Kopierens von Objekten aus einem Baum in einer Weise, dass es nicht von einer seiner früheren Versionen abhängig ist, die einem gewissen Grad an Änderungen unterliegen könnten. Dieser Klonprozess wird durch die Übernahme der Serialisierung erheblich vereinfacht. Durch Serialisieren des Objekts in ein Byte-Array und anschließendes Deserialisieren kann der Benutzer eine Kopie des Objekts erhalten.

Cross-Java-Virtual-Machine-Synchronisation

Der Hauptvorteil des Praktizierens von Serialisierung liegt in der Tatsache, dass es dem Benutzer ermöglicht, über verschiedene JVMs hinweg zu arbeiten. Sobald die Serialisierung übernommen wurde, spielt es keine Rolle, ob diese JVMs auf denselben oder unterschiedlichen Architekturen und Betriebssystemen arbeiten oder nicht.

Beharrlichkeit

Indem man die Serialisierung auf ein Objekt anwendet, kann man den Zustand des Objekts ohne irgendwelche Unannehmlichkeiten direkt speichern. Darüber hinaus ermöglicht es dem Benutzer auch, den genannten Zustand in einer Datenbank zu speichern, die später zu einem beliebigen Zeitpunkt in der Zukunft abgerufen werden kann.

Lesen Sie: Interviewfragen und Antworten zur Java-Serialisierung

Serialisieren eines Objekts – Der beteiligte Prozess

Bevor wir mit der Serialisierung eines Objekts fortfahren, müssen wir zunächst feststellen, ob es überhaupt serialisierbar ist oder nicht. Wie stellen wir das nun fest? Ein Objekt in Java ist genau dann serialisierbar, wenn seine Klasse oder eine seiner übergeordneten Klassen die Implementierung der java.io.Serializable-Schnittstelle zulassen. Die Kriterien werden auch erfüllt, wenn diese Klassen auch ihre Subschnittstelle implementieren, die java.io.Externalizable ist.

Wie oben besprochen, ist die Cross-JVM-Synchronisation eine der leistungsfähigsten Anwendungen für die Verwendung der Serialisierung. Wenn wir ein Objekt serialisieren, wandeln wir den Zustand dieses Objekts in einen Bytestrom um. Dadurch wird es uns möglich, das Objekt von einer Java Virtual Machine auf eine andere zu übertragen. Somit kann auch dieser Bytestrom wieder in das ursprüngliche Objekt zurückgewandelt werden.

Diese Umwandlung wird auch als Deserialisierung bezeichnet. Es ist der umgekehrte Prozess der Serialisierung, bei dem der zuvor serialisierte Bytestrom eines Objekts des Senders auf der Empfängerseite neu erstellt wird.

Vorteile der Serialisierung in Java

Bei der Erörterung der Verwendungen und Anwendungen der Serialisierung in den vorangegangenen Abschnitten haben wir bereits einiges Licht auf ihre verschiedenen Vorzüge geworfen. Es ist jetzt an der Zeit, sich eingehender mit ihnen zu befassen.

  • Einer der wichtigsten Vorteile der Serialisierung ist die Tatsache, dass es sich um eine integrierte Funktion handelt. Um die Serialisierung zu implementieren oder auszuführen, müssen Sie keine Software von Drittanbietern in Anspruch nehmen.
  • Selbst für Benutzer, die Anfänger sind und sich gerade erst einarbeiten, ist die Serialisierung ein ziemlich einfach zu erlernender und zu verstehender Prozess.
  • Oft bekommen Entwickler mit unterschiedlichem Programmierhintergrund einen Hauch Hintergrund, wenn sie sich mit den Nuancen einer neuen Sprache auseinandersetzen müssen. Im Fall der Serialisierung ist der Prozess jedoch universell und daher allen Entwicklern da draußen ziemlich vertraut.
  • Es ist nicht nur einfach zu bedienen und zu implementieren, sondern auch ebenso einfach anzupassen.
  • Derzeit gibt es eine Reihe kritischer Technologien, die die Serialisierung in ihrem Betrieb nutzen. Dies liegt daran, dass serialisierte Datenströme Verschlüsselung, Authentifizierung, Komprimierung und sicheres Java-Computing unterstützen.

Nachteile der Serialisierung in Java

Keine Programmiersprache ist hundertprozentig perfekt, und das können sie auch nicht von sich behaupten. Folglich sind auch die Konzepte und die Prozesse, die sie konstituieren, nicht ohne ihre eigenen Fehler. Hier sind einige der allgemeinen Nachteile, die mit dem Prozess der Serialisierung verbunden sind.

  • Bei einigen Serialisierungsprozessen muss auch die Deserialisierung gleichzeitig angewendet werden. Der Nachteil der Deserialisierung besteht nun darin, dass sie Objekte spröde macht. Infolgedessen gibt es nie eine vollständige Gewissheit, dass das Objekt effektiv deserialisiert wird.
  • Wenn der Prozess der Serialisierung aufgerufen wird, verursacht er die Erstellung einer Reihe von transienten Variablen. Diese transienten Variablen nehmen, wenn sie erstellt werden, zusätzlichen Speicherplatz in Anspruch. Viele dieser transienten Variablen werden jedoch nicht initialisiert, da der Konstruktor während dieser Prozesse nicht aufgerufen wird. Anschließend wirken sie sich auf eine Variation des Standard-Java-Flows aus.
  • Trotz aller Zeitverbrauchsoptimierungen wird der Prozess der Serialisierung zunehmend ineffizient, wenn es um die Speichernutzung geht.
  • Der Prozess der Serialisierung bietet keinen Übergangskontrollmechanismus für jede Standard Edition von Java. Daher wird es nicht bevorzugt, in Verbindung mit Anwendungen verwendet zu werden, die einen parallelen Zugriff ohne die Anforderung von APIs von Drittanbietern benötigen.
  • Bei der Verwendung der Serialisierung muss man häufig Kompromisse eingehen, wenn es darum geht, eine feinkörnige Kontrolle für den Zugriff auf die Objekte zu erhalten.

Serialisierung durch eine praktische Linse gesehen

Bisher haben wir den Prozess der Serialisierung als theoretisches Konzept diskutiert, einschließlich seiner verschiedenen Vor- und Nachteile. Es ist nun an der Zeit, in eine Diskussion einzutauchen, die es uns ermöglicht, die Serialisierung aus praktischer Sicht und ihre Implementierung zu visualisieren. Nachfolgend sind einige Fälle aufgeführt, die uns helfen, die praktische Umsetzung der Serialisierung zu verstehen.

Muss gelesen werden: Eigenschaften und Vorteile von JavaBeans: Wie sollten Sie sie verwenden?

Serialisierung und Vererbung

Vererbung in Java wird allgemein als das Phänomen definiert, bei dem eine Klasse die Methoden und Felder einer anderen Klasse erwirbt oder erbt. Die Klasse, die die Eigenschaften erbt, wird als Unterklasse bezeichnet, und die Klasse, deren Eigenschaften geerbt werden, wird als Oberklasse bezeichnet. Der Begriff Superklasse wird auch synonym mit der Basisklasse und der Elternklasse verwendet.

Unser erster Fall befasst sich mit der Serialisierung im Kontext von Oberklassen. Wenn eine Oberklasse serialisierbar ist, können im Allgemeinen auch ihre Unterklassen standardmäßig als serialisierbar betrachtet werden. Dies gilt natürlich nur, wenn die Superklasse die Serializable-Schnittstelle implementiert. Es gibt jedoch auch bestimmte Fälle, in denen die Unterklasse serialisiert werden kann, selbst wenn die Oberklasse die Serializable-Schnittstelle nicht implementiert.

Dies findet statt, wenn es der Unterklasse gelingt, die Serializable-Schnittstelle in ihrer einen Eigenschaft zu implementieren. Wenn die Oberklasse die Serialisierbare Schnittstelle unter keinen Umständen implementiert, dann können die Objekte der Unterklasse manuell serialisiert werden, wenn die Unterklasse selbst die Serialisierbare Schnittstelle implementiert.

Manchmal kann der Benutzer auch auf eine dritte Möglichkeit stoßen. Diese Möglichkeit ergibt sich, wenn die Oberklasse serialisierbar ist, der Benutzer den Prozess jedoch nicht unbedingt in Bezug auf die Unterklasse übernehmen muss.

In solchen Situationen gibt es Möglichkeiten, die ungewollte Serialisierung der Unterklasse bewusst zu verhindern. Dies kann durch Implementieren der Methoden writeObject() und readObject() in der Unterklasse erfolgen. Die Implementierung dieser Methoden allein reicht jedoch nicht aus. Neben dem Schreiben dieser Methoden muss der Benutzer auch sicherstellen, dass die genannten Methoden nicht die NotSerializableException aus ihrer Implementierung werfen.

Serialisierung mit Hilfe eines statischen Members

Wenn der Prozess der Serialisierung implementiert wird, werden die statischen Feldmitglieder im Prozess ignoriert. Dies liegt vor allem daran, dass sich die Serialisierung als Verfahren weitgehend mit dem letzten Stand des betreffenden Objekts befasst. Als Ergebnis werden zwar die einer bestimmten Instanz einer Klasse zugeordneten Daten erfolgreich serialisiert, das damit verbundene statische Mitgliedsfeld jedoch nicht.

Serialisierung in Bezug auf XML-Dokumente

Die Serialisierung von Java-Objekten in XML kann auf verschiedene Weise erreicht werden. Primär werden sie mit Hilfe von XMLEncoder und XMLDecoder realisiert. Das Hauptziel der Serialisierung von Java-Objekten in XML-Dokumente besteht darin, die verschiedenen Nachteile zu begrenzen, die der Prozess der Serialisierung von Natur aus mit sich bringt.

Eines der relevantesten Probleme im Prozess der Serialisierung besteht darin, dass die Logik, die die serialisierten Objekte speichert und wiederherstellt, nur auf der internen Struktur der konstituierenden Klassen basiert. Es berücksichtigt keine der Änderungen, die möglicherweise an diesen Klassen in der Zeit verursacht wurden, die zwischen dem Speichern des Objekts und dem Abrufen desselben verstreicht. In der Folge führt dies zum drohenden Scheitern des Deserialisierungsprozesses.

Die Serialisierung führt auch zu Versionierungsproblemen. Dies geschieht, wenn der Benutzer ein Objekt mit einer Version der Klasse speichert, aber versucht, dieselbe Klasse zu deserialisieren, indem er eine andere oder eine neue Version der Klasse verwendet. In diesem Fall schlägt auch der Deserialisierungsprozess fehl.

Um all diese Probleme zu vermeiden, ziehen es einige Benutzer daher vor, Objekte in XML-Dokumente zu serialisieren, anstatt den herkömmlichen Ansatz zu wählen, sie in ein binäres Format zu serialisieren. Darüber hinaus stellt die Serialisierung von Java-Objekten in XML-Dokumente auch sicher, dass das Objekt für Menschen lesbar wird, wodurch ein höheres Maß an Komfort ermöglicht wird.

Checkout: Fragen und Antworten zu Java-Interviews

Das Externalisierbare Interface verstehen

Die Externalizable-Schnittstelle in Java ist der Serialisierungsschnittstelle ziemlich ähnlich. Der Unterschied liegt in ihrer Fähigkeit, eine kundenspezifische Serialisierung anzubieten. Die externalisierbare Schnittstelle gibt Ihnen die Möglichkeit, die Objekte auszuwählen, die Sie im Stream speichern möchten, während die Serialisierungsschnittstelle Ihnen nicht das gleiche Privileg einräumt.

Man kann die externalisierbare Schnittstelle unter java.io nutzen. Die externalisierbare Schnittstelle stellt dem Benutzer ebenfalls zwei Methoden zur Verfügung. Der erste ist der öffentliche void writeExternal(ObjectOutput out) löst IOException aus. Die andere ist die öffentliche void readExternal(ObjectOutput in) löst IOException aus.

Unterschied zwischen Serialisierung und Externalisierung

Abgesehen von ihrer Fähigkeit, eine kundenspezifische Serialisierung anzubieten, unterscheiden sich auch einige andere Schlüsselvariablen von Serialisierung und Externalisierung. Der folgende Abschnitt betrachtet sie genauer.

Implementierung

Einer der Hauptunterschiede zwischen den serialisierbaren und den externalisierbaren Schnittstellen liegt in ihrer Implementierung. Die externalisierbare Schnittstelle erwartet, dass der Benutzer explizit die Objekte erwähnt, die serialisiert werden sollen. Dies ist nicht der Fall, wenn es um die serialisierbare Schnittstelle geht. Bei der serialisierbaren Schnittstelle werden alle Objekte und Variablen ohne Unterscheidung zur Laufzeit serialisiert.

Methoden

Die Externalizable-Schnittstelle besteht hauptsächlich aus zwei Methoden. Dies sind die Methode writeExternal() und die Methode readExternal(). Die serialisierbare Schnittstelle hingegen umfasst keinerlei Methoden.

Verfahren

Wenn man den Prozess der Serialisierung in der externalisierbaren Schnittstelle durchführt, erhält man das Privileg der angepassten Serialisierung. Während man sich bei der serialisierbaren Schnittstelle dem Standard-Serialisierungsprozess unterwirft.

Abwärtskompatibilität und Kontrolle

Das Externalizable Interface unterstützt die Serialisierung ohne Vorbehalte gegenüber der jeweiligen Versionskontrolle. Das einzige Problem bei diesem Ansatz ist, dass der Benutzer selbst für die Serialisierung der Oberklasse verantwortlich sein muss. Im Gegensatz dazu erfordert die Serialisierungsschnittstelle, dass an beiden Enden dieselbe Version der JVMs vorhanden ist. Es ermöglicht jedoch eine standardmäßige Serialisierung aller Objekte und Klassen, einschließlich der Oberklasse.

Öffentlicher No-Arg-Konstruktor

Beim Rekonstruieren des serialisierten Objekts erfordert die Externalisierungsschnittstelle die Verwendung des öffentlichen No-Arg-Konstruktors. Anders verhält es sich bei der Serialisierungsschnittstelle, die den no-arg-Konstruktor nicht explizit benötigt, sondern Reflektion nutzt, um die serialisierten Objekte und Klassen zu rekonstruieren.

Serialisierung in Java: Die Kontroversen

Es gibt einige Kontroversen, die sich mit dem Konzept der Serialisierung in Java verbinden. Viele von ihnen beschäftigen sich in erster Linie damit, die Serialisierung als Verfahren zu entfernen. Es wird allgemein angenommen, dass die Architekten von Oracle seit langem erwägen, die Serialisierung aus Java zu entfernen, da sie dies für einen schrecklichen Fehler von 1997 halten.

Nach ihren Recherchen sind die Fehler im Design des Serialisierungsverfahrens so groß, dass sie eine Bedrohung für die Daten selbst darstellen. Insofern führte Mark Reinhold 1997 fast ein Drittel aller Java-Schwachstellen auf den Prozess der Serialisierung zurück, wobei er sogar angab, dass der Quotient auch deutlich darüber liegen könnte.

Daher besteht eine gute Möglichkeit, dass die Serialisierung als Konstrukt in den kommenden Updates vollständig aus den Annalen von Java entfernt oder ersetzt wird. Das mag auch daran liegen, dass ein Großteil der Experten die Serialisierung nicht für eine idealistische Option hält, die Einsteiger in Java in ihren Projekten umsetzen können.

Lesen Sie auch: Ideen und Themen für Java-Projekte

Holen Sie sich einen Softwareentwicklungskurs von den besten Universitäten der Welt. Verdienen Sie Executive PG-Programme, Advanced Certificate-Programme oder Master-Programme, um Ihre Karriere zu beschleunigen.

Fazit

Eine Diskussion und Beratung über die Serialisierung kann nicht abgeschlossen werden, indem einige ihrer besten Praktiken beleuchtet werden. Hier sind einige, die der Benutzer übernehmen muss, um die beste Erfahrung für sich selbst zu gewährleisten.

  • Um serialisierbare Felder zu bezeichnen, muss man das Tag javadoc@serial verwenden.
  • Für Dateien, die serialisierte Objekte darstellen, wird die Verwendung der Erweiterung .ser bevorzugt.
  • Normalerweise ist es verpönt, statische oder transiente Felder der Standard-Serialisierung zu unterwerfen.
  • Sofern es nicht zwingend erforderlich ist, muss man unter allen Umständen versuchen, die Serialisierung von Extendable Classes zu vermeiden.
  • Bei der Implementierung der Serialisierung muss sichergestellt werden, dass innere Klassen nicht in den Serialisierungsprozess einbezogen werden.

Wenn Sie mehr über Java, OOPs und Full-Stack-Softwareentwicklung erfahren möchten, schauen Sie sich das Executive PG-Programm in Full-Stack-Softwareentwicklung von upGrad & IIIT-B an, das für Berufstätige konzipiert ist und mehr als 500 Stunden strenge Schulungen bietet. Über 9 Projekte und Aufgaben, IIIT-B-Alumni-Status, praktische praktische Abschlussprojekte und Arbeitsunterstützung bei Top-Unternehmen

Bereiten Sie sich auf eine Karriere der Zukunft vor

Bewerben Sie sich jetzt für den Master in Software Engineering