Was ist das Konzept der Serialisierung in Java?



Dieser Artikel bietet einen umfassenden Ansatz für das Konzept der Serialisierung in Java sowie Echtzeitbeispiele zum besseren Verständnis.

Serialisierung in ist ein wichtiges Konzept, das sich mit der Konvertierung von Objekten in einen Bytestream befasst, um die Java-Objekte von einer Java Virtual Machine zur anderen zu transportieren und sie in der ursprünglichen Form neu zu erstellen. Ich werde das Docket für diesen Artikel wie folgt ausrichten:

Was ist Serialisierung in Java?

Serialisierung In Java wird der Java-Code konvertiert Objekt in ein Byte-Stream , um den Objektcode von einer Java Virtual Machine auf eine andere zu übertragen und ihn mithilfe des Prozesses von neu zu erstellen Deserialisierung.





Serialization-in-Java-Edureka-Picture-1

Warum brauchen wir Serialisierung? in Java ?

Wir benötigen Serialisierung aus folgenden Gründen:



  • Kommunikation : Die Serialisierung beinhaltet die Prozedur des Objekts Serialisierung und Übertragung. Auf diese Weise können mehrere Computersysteme Objekte gleichzeitig entwerfen, gemeinsam nutzen und ausführen.

  • Caching : Der Zeitaufwand für die Erstellung eines Objekts ist höher als der Zeitaufwand für die De-Serialisierung. Die Serialisierung minimiert den Zeitaufwand um Caching die riesigen Objekte.

  • Tiefe Kopie :: Klonen Der Prozess wird durch Serialisierung vereinfacht. Eine genaue Replik eines Objekts wird erhalten durchSerialisierung des Objekts zu a Byte-Array und dann de-serialisieren.



  • Kreuz JVM-Synchronisation: Der Hauptvorteil der Serialisierung ist, dass esfunktioniert über verschiedene JVMs hinweg, die möglicherweise auf verschiedenen ausgeführt werden Architekturen oder Betriebssysteme

  • Beharrlichkeit: Der Status eines Objekts kann direkt gespeichert werden, indem Serialisierung darauf angewendet und in a gespeichert wird Datenbank so dass es sein kann später abgerufen.

Wie serialisieren wir ein Objekt?

ZU Java-Objekt ist serialisierbar genau dann, wenn seine Klasse oder eine seiner übergeordneten Klassen entweder die Java . ich . Serialisierbar Schnittstelle oder deren Subschnittstelle, java.io.Externalizable.

Während des Serialisierungsprozesses konvertieren wir den Status eines Objekts in einen Byte-Stream, sodass er von einer JVM zur anderen übertragen werden kann, und setzen den Byte-Stream wieder in das ursprüngliche Objekt zurück.

//Schnittstelle

Paket Serial1 import java.io.Serializable public class Mitarbeiter implementiert Serializable {private static final long serialVersionUID = 1L // UID der seriellen Version int id Zeichenfolgenname public Employee (int id, Zeichenfolgenname) {this.id = id this.name = name }}

// Serialisieren

Javascript-Länge eines Arrays
Paket Serial1 import java.io. * Klasse Persist {public static void main (String args []) {try {Mitarbeiter emp1 = neuer Mitarbeiter (20110, 'John') Mitarbeiter emp2 = neuer Mitarbeiter (22110, 'Jerry') Mitarbeiter emp3 = neuer Mitarbeiter (20120, 'Sam') FileOutputStream fout = neuer FileOutputStream ('output.txt') ObjectOutputStream out = neuer ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serialisierung und Deserialisierung wurden erfolgreich ausgeführt')} catch (Ausnahme e) {System.out.println (e)}}}

Ausgabe:

Serialisierung und Deserialisierung wurden erfolgreich ausgeführt

Deserialisierung : Es ist der umgekehrte Prozess der Serialisierung, bei dem der serialisierte Byte-Stream eines Objekts vom Absender am empfangenden Ende neu erstellt wird.

// Deserialisieren

Paket Serial1 import java.io. * Klasse Depersist {public static void main (String args []) {try {ObjectInputStream in = neuer ObjectInputStream (neuer FileInputStream ('output.txt')) Mitarbeiter e1 = (Mitarbeiter) in.readObject ( ) Mitarbeiter e2 = (Mitarbeiter) in.readObject () Mitarbeiter e3 = (Mitarbeiter) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Ausnahme e) {System.out.println (e)}}}

Ausgabe:

20110 John
22110 Jerry

20120 Sam

Vor- und Nachteile der Serialisierung in Java

Vorteile:

  • Der Serialisierungsprozess ist a eingebaut Funktion, für die keine Software von Drittanbietern erforderlich ist, um die Serialisierung auszuführen
  • Das Serialisierungsverfahren hat sich bewährt einfach und einfach verstehen

  • Serialisierungsverfahren ist Universal- und Entwickler mit unterschiedlichem Hintergrund sind damit vertraut

  • Es ist einfach zu bedienen und einfach anzupassen

  • Serialisierte Datenströme Unterstützung Verschlüsselung, Komprimierung, Authentifizierung und sicheres Java-Computing

  • Da sind viele kritische Technologien auf Serialisierung setzen.

Nachteile:

  • Objekte während der DeSerialisierung wird spröde und sie sind nicht sicher, ob sie effektiv deSerialisiert werden.

  • Die während der Serialisierung deklarierten transienten Variablen erzeugen Speicherplatz, aber der Konstruktor wird nicht aufgerufen, was dazu führt, dass die Initialisierung transienter Variablen fehlschlägt, was zu a führt Variation zum Standard Java Flow.

  • Der Prozess der Serialisierung ist ineffizient in Bezug auf die Speichernutzung.

  • Die Serialisierung ist nicht vorzuziehen, um in den Anwendungen verwendet zu werden, die dies benötigen gleichzeitiger Zugriff ohne die Anforderung von APIs von Drittanbietern , da die Serialisierung keinen Übergangskontrollmechanismus für jede SE bietet.

  • Das Serialisierungsverfahren wird nicht angeboten feinkörnige Kontrolle um auf Objekte zuzugreifen.

Praktische Beispiele für die Serialisierung in Java

Serialisierung mit Vererbung

Fall 1: Wenn Superklasse serialisierbar ist, sind standardmäßig auch ihre Unterklassen serialisierbar.

In diesem Fall ist die Unterklasse ist standardmäßig serialisierbar, wenn die Superklasse implementiert die Serialisierbare Schnittstelle

Paket SerializationInheritance Import java.io.FileInputStream Import java.io.FileOutputStream Import java.io.ObjectInputStream Import java.io.ObjectOutputStream Import java.io.Serializable Klasse A implementiert Serializable {int i public A (int i) {this.i = i}} Klasse B erweitert A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public statisch void main (String [] args) löst eine Ausnahme aus {B b1 = new B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = neuer ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Das Objekt wurde serialisiert') FileInputStream fis = neuer FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Das Objekt wurde deserialisiert') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Ausgabe:

j = 20
Das Objekt wurde serialisiert
Das Objekt wurde deserialisiert
i = 200
j = 400

Fall 2: Eine Unterklasse kann serialisiert werden, wenn sie die serialisierbare Schnittstelle implementiert, auch wenn eine Superklasse die serialisierbare Schnittstelle nicht implementiert.

In diesem Fall, wenn die Superklasse implementiert das nicht Serialisierbare Schnittstelle dann die Objekte der Unterklasse kann manuell serialisiert werden, indem die serialisierbare Schnittstelle in der Unterklasse implementiert wird.

Paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass-Konstruktor aufgerufen')}} Klassenunterklasse erweitert Superklasse implementiert Serializable {int j öffentliche Unterklasse (int i, int j) {super (i) this.j = j }} public class test2 {public statisch void main (String [] args) löst eine Ausnahme aus {Unterklasse b1 = neue Unterklasse (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = neuer FileOutputStream ('output.ser') ObjectOutputStream oos = neuer ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Das Objekt wurde serialisiert') FileInputStream fis = neuer FileInputStream ('output.ser') ObjectInputStream ois = neue ObjectInputStream (fis) -Unterklasse b2 = (Unterklasse) ois.readObject ( ) ois.close () fis.close () System.out.println ('Das Objekt wurde deserialisiert') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Das Objekt wurde serialisiert
Superklassenkonstruktor aufgerufen
Das Objekt wurde deserialisiert
i = 50
j = 20

Fall 3: Wenn die Oberklasse serialisierbar ist, die Unterklasse jedoch nicht serialisiert werden muss.

In diesem Fall kann die Serialisierung der Unterklasse verhindert werdendurch die Umsetzung der writeObject () und readObject () Methoden in der Unterklasse und es muss werfen NotSerializableException von diesen Methoden.

Paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class i public Parent (int i) {this.i = i}} Klassenkind erweitert Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) löst aus IOException {neue NotSerializableException () auslösen} private void readObject (ObjectInputStream in) löst IOException aus {wirft neue NotSerializableException ()}} öffentliche Klasse test3 {public static void main (String [] args) löst Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = neuer FileOutputStream ('abc.ser') ObjectOutputStream oos = neuer ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Object wurde serialisiert ') FileInputStream fis = neuer FileInputStream (' abc.ser ') ObjectInputStream ois = neuer ObjectInputStream (fis) Kind b2 = (Kind) ois.readObject () ois.close () fis.close () System.out. println ('Objekt wurde deserialisiert') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Ausgabe:

i = 100
j = 200
Ausnahme im Thread 'main' java.io.NotSerializableException
bei SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode)

Serialisierung mit einem statischen Element

Die Serialisierung des statischen Elementfelds wird bei der Serialisierung ignoriert. Serialisierung istbezogen auf den neuesten Status des Objekts. Daher sind nur die Daten, die einer bestimmten Instanz einer Klasse zugeordnet sindserialisiert, aber nicht das statische Mitgliedsfeld.

Paket stati import java.io. * Klasse StaticSerial implementiert Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Zum Zeitpunkt der Serialisierung, Das statische Element hat den Wert: '+ i) try {FileOutputStream fos = neuer FileOutputStream (' F: File.ser ') ObjectOutputStream oos = neuer ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = neuer FileInputStream ('F: File.ser') ObjectInputStream ois = neuer ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Nach der Deserialisierung hat das statische Element den Wert:' + i)} catch (Ausnahme e) {System.out.println (e)}}}

Ausgabe:

Zum Zeitpunkt der Serialisierung hat das statische Element den Wert: 100
Nach der Deserialisierung hat das statische Element den Wert: 99

Externalisierbare Schnittstelle

Das Externalisierbare Schnittstelle in Java ähnelt der Serialisierung, aber der einzige Unterschied besteht darin, dass es bieten kann kundenspezifische Serialisierung Hier können Sie entscheiden, welche Objekte im Stream gespeichert werden sollen.

Die Externalizable-Oberfläche ist in java.io verfügbar und bietet zwei Methoden:

  • public void writeExternal (ObjectOutput out) löst eine IOException aus
  • public void readExternal (ObjectInput in) löst eine IOException aus

Die Hauptunterschiede zwischen Serialisierung und Externalisierung sind folgende:

  • Implementierung : Externalizable Interface nimmt den Benutzer davon aus ausdrücklich Erwähnen Sie die zu serialisierenden Objekte. In der Serialisierungsschnittstelle werden alle Objekte und Variablen in der Serialisierungsschnittstelle serialisiert Laufzeit.

  • Methoden : Externalisierbare Schnittstelle besteht aus zwei Methoden, nämlich:

    • writeExternal ()

    • readExternal ()

Während Serializable Interface keine Methoden enthält.

  • Prozess: Serialisierungsprozess in Externalizable Interface bietet Anpassung zum Serialisierungsprozess. Die Serialisierungsschnittstelle bietet jedoch die Standard Serialisierungsprozess.

  • Abwärtskompatibilität und Kontrolle: Externalizable Interface unterstützt die Serialisierung unabhängig von der Versionskontrolle und das einzige Problem ist, dass der Benutzer bei der Serialisierung von Super Class verantwortlich sein muss. Auf der anderen Seite benötigt die Serialisierungsschnittstelle die gleiche Version von JVMs an beiden Enden, beinhaltet jedoch die automatische Serialisierung aller Objekte und Klassen einschließlich der Oberklasse.

  • Öffentlicher No-Arg-Konstruktor: Anforderungen an die Externalisierungsschnittstelle Öffentlicher No-Arg-Konstruktor um das serialisierte Objekt zu rekonstruieren. Während die Serialisierungsschnittstelle keinen No-Arg-Konstruktor benötigt, wird sie verwendet Betrachtung um das serialisierte Objekt oder die serialisierte Klasse zu rekonstruieren.

package ext import java.io. * class Demo implementiert java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Willkommen bei Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (Dateiname) ObjectOutputStream out = new ObjectOutputStream (Datei) out .writeObject (Objekt) out.close () file.close () System.out.println ('Objekt wurde serialisiert')} catch (IOException ex) {System.out.println ('IOException wird abgefangen')} Demo object1 = null try {FileInputStream file = new FileInputStream (Dateiname) ObjectInputStream in = new ObjectInputStream (Datei) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objekt wurde deserialisiert ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException wird abgefangen ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException wird abgefangen')}}}

Vorübergehendes Schlüsselwort

Transientes Schlüsselwort ist a reserviertes Schlüsselwort in Java. Es wird als verwendet Variable ändern zum Zeitpunkt des Serialisierungsprozesses. Durch das Deklarieren einer Variablen mit dem Schlüsselwort Transient wird verhindert, dass die Variable serialisiert wird.

Was ist eine String-Methode in Java

UID der Serienversion

Bevor der Serialisierungsprozess beginnt, wird jede serialisierbare Klasse / jedes serialisierbare Objekt mit einem verknüpft eindeutige Identifikationsnummer bereitgestellt von der JVM des Host-Computers. Diese eindeutige ID wird aufgerufen UID der Serienversion . Diese UID wird von der JVM als Identifikation des empfangenden Endes verwendet, um zu bestätigen, dass dasselbe Objekt am empfangenden Ende deSerialisiert wird.

Kontroversen der Serialisierung in Java

Oracle Architekten beabsichtigen, die Serialisierung aus Java zu entfernen, da sie dies als Schrecklicher Fehler von 1997 . Nach hektischen Recherchen stellten die Entwickler von Oracle einige Mängel im Design des Serialisierungsverfahrens fest, die eine Bedrohung für die Daten darstellen.

Im Jahr 1997Mark Reinhold erklärt: „ Wir nennen die Serialisierung gerne 'das Geschenk, das immer wieder gegeben wird', und die Art des Geschenks, das sie immer wieder gibt, sind Sicherheitslücken. Wahrscheinlich war ein Drittel aller Java-Schwachstellen mit einer Serialisierung verbunden, die über die Hälfte betragen könnte. Es ist eine erstaunlich fruchtbare Quelle von Schwachstellen, ganz zu schweigen von Instabilitäten. “

Es besteht die Möglichkeit, dass die Serialisierung in den kommenden Java-Updates entfernt oder ersetzt wird, und für einen Anfänger in Java die Serialisierung konnte nicht eine idealistische Option sein in ihren Projekten

Best Practices bei der Verwendung der Serialisierung in Java

Im Folgenden sind einige bewährte Methoden aufgeführt, die befolgt werden müssen

  • Es wird die Verwendung empfohlen javadoc @ serielles Tag zur Kennzeichnung serialisierbarer Felder.
  • Das .sein Die Erweiterung wird bevorzugt für Dateien verwendet, die serialisierte Objekte darstellen.
  • Es wird nicht empfohlen, statische oder transiente Felder zu durchlaufen Standard-Serialisierung.
  • Erweiterbare Klassen sollte nicht serialisiert werden, es sei denn, es ist verpflichtend.
  • Innere Klassen sollte vermieden werden, um an der Serialisierung beteiligt zu sein.

Damit sind wir am Ende dieses Artikels angelangt. Ich hoffe, Sie haben die Grundlagen der Serialisierung in Java, ihre Typen und Funktionen verstanden.

Besuche die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka richtet sich an Studenten und Fachleute, die Java-Entwickler werden möchten. Der Kurs soll Ihnen einen Vorsprung in die Java-Programmierung verschaffen und Sie sowohl für grundlegende als auch für fortgeschrittene Java-Konzepte sowie für verschiedene Java-Frameworks wie Hibernate & schulen Frühling .

Hast du eine Frage an uns? Erwähnen Sie es im Kommentarbereich dieses Artikels „Serialisierung in Java“ und wir werden uns so schnell wie möglich bei Ihnen melden.