English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Wird der Konstruktor eines Objekts beim Deserialisieren in Java aufgerufen?

In Java ist Serialisierung ein Konzept, durch das wir den Zustand eines Objekts in einen Byte-Stream schreiben können, um ihn über das Netzwerk (verwendend JPA und RMI-Technologien) zu übertragen.

Objekt serialisieren-

  • Stellen Sie sicher, dass die Klasse das Serializable-Interface implementiert.

  • Erstellen Sie einFileOutputStreamObjekts, das die Datei darstellt, in die das Objekt gespeichert werden soll (abstrakter Pfad).

  • Durch Übergeben des oben erstelltenFileOutputStreamObjekt, um ein ObjectOutputStream-Objekt zu erstellen.

  • Verwenden Sie die Methode writeObject() zum Schreiben eines Objekts in eine Datei.

Objekt deserialisieren

  • Erstellen Sie einFileInputStreamObjekt, das eine Datei darstellt, die Serialisierungsobjekte enthält.

  • Verwenden Sie die Methode readObject() zum Lesen eines Objekts aus einer Datei.

  • Verwenden Sie das erhaltene Objekt.

Konstruktion Ähnliche Methoden und ihr Aufruf bei der Erstellung von Objekten der Klasse, die sie erstellt, werden normalerweise verwendet, um die Variablen einer Instanz der Klasse zu initialisieren. Der Konstruktor hat den gleichen Namen wie die Klasse und hat keine Rückgabetyp.
Wenn kein Konstruktor bereitgestellt wird, erstellt der Compiler für Sie einen Konstruktor, der die Instanzvariablen mit Standardwerten initialisiert.

Konstruktor und Deserialisierung

Wenn wir ein Objekt deserialisieren, wird niemals der Konstruktor seiner Klasse aufgerufen. Betrachten wir das folgende Beispiel, hier gibt es eine Klasse namens Student, die zwei Instanzvariablen und einen Standardkonstruktor (mit zwei festgelegten Werten initialisiert) und einen parameterisierten Konstruktor hat.

Die display()-Methode dieser Klasse zeigt die Werte der aktuellen Instanz an.
Wir übergeben zwei Werte (vani und27)und serialisieren, um ein Objekt der Klasse Student zu erstellen.
Wenn wir dieses Objekt deserialisieren und die display()-Methode aufrufen, werden die übergebenen Werte gedruckt. Statistische Variablen drucken den neuen (aktuellen) Wert in der Klasse aus.

Beispiel

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Student implements Serializable{
   private String name;
   private transient int age;
   private static int year = 2018;
   public Student(){
      System.out.println("This is a constructor");
      this.name = "Krishna";
      this.age = 25;
   }
   public Student(String name, int age){
      this.name = name;
      this.age = age;
   }
   public void display() {
      System.out.println("Name: "+this.name);
      System.out.println("Age: "+this.age);
      System.out.println("Year: "+Student.year);
   }
   public void setName(String name) {
      this.name = name;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public void setYear(int year) {
      Student.year = year;
   }
}
public class SerializeExample{
   public static void main(String args[]) throws Exception{
      //Student-Objekt erstellen
      Student std = new Student("Vani", 27);
      //Objekt serialisieren
      FileOutputStream fos = new FileOutputStream("e:\\student.ser");
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(std);
      oos.close();
      fos.close();
      //Daten vor Deserialisierung ausgeben
      System.out.println("Wert vor Deserialisierung");
      std.display();
      //Wert des statischen Variablen ändern
      std.setYear(2019);
      //Wert des Instanzvariablen ändern
      std.setName("Varada");
      //Wert des transienten Variablen ändern
      std.setAge(19);
      System.out.println("Objekt serialisiert.......");
      //Objekt deserialisieren
      FileInputStream fis = new FileInputStream("e:\\student.ser");
      ObjectInputStream ois = new ObjectInputStream(fis);
      Student deSerializedStd = (Student) ois.readObject();
      System.out.println("Objekt de-serialisiert.......);
      ois.close();
      fis.close();
      System.out.println("Wert nach Deserialisierung");
      deSerializedStd.display();
   }
}

Ausgaberesultat

Wert vor Deserialisierung
Name: Vani
Alter: 27
Jahr: 2018
Objekt serialisiert......
Objekt de-serialisiert......
Wert nach Deserialisierung
Name: Vani
Alter: 0
Jahr: 2019