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

Wird der Wert statischer Variablen beim Serialisieren eines Objekts in Java gespeichert?

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 (mit Technologien wie JPA und RMI) zu übertragen.

Objekt serialisieren-

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

  • Erstellen Sie eineFileOutputStreamObjekts, 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 eineFileInputStreamObjekt, 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.

Variablen im deserialisierten Objekt

Wenn wir nur ein Objekt deserialisieren, werden die Instanzvariablen gespeichert und haben nach diesem Prozess die gleichen Werte.

Transiente Variablen  - Nie in Betracht ziehenTransiente VariablenWerte (wird sie aus dem Serialisierungsprozess ausgeschlossen). Zum Beispiel, wenn wir eine transient Variable deklarieren, bleibt ihr Wert nach der Deserialisierung immer null, false oder Null (Standardwert).

Statische Variablen  - werden im Deserialisierungsprozess nicht beibehaltenStatische VariablenWerte. Tatsächlich werden statische Variablen auch nicht serialisiert, aber weil sie der Klasse gehören. Nach der Deserialisierung erhalten sie ihre aktuellen Werte von der Klasse.

Beispiel

In diesem Programm haben wir vor der Deserialisierung die Werte der Instanz, der statischen und transienten Variablen der Klasse geändert.

Nach diesem Prozess werden die Werte der Instanzvariablen gleich sein. Temporäre Variablen zeigen Standardwerte an, während statische Variablen die neuen (aktuellen) Werte der Klasse anzeigen.

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{}}
      //Erstellung eines neuen Student-Objekts
      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();
      //Veränderung des Wertes der statischen Variablen
      std.setYear(2019);
      //Veränderung des Wertes der Instanzvariablen
      std.setName("Varada");
      //Veränderung des Wertes des transitorischen Variablen
      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();
   }
}

Ausgabeergebnis

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