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

Quando serializzo un oggetto in Java, vengono memorizzati i valori delle variabili statiche?

In Java, la serializzazione è un concetto attraverso il quale possiamo scrivere lo stato dell'oggetto in un flusso di byte, in modo da poterlo trasmettere attraverso la rete (utilizzando tecnologie come JPA e RMI).

Serializzazione dell'oggetto-

  • Assicurati che la classe implementi l'interfaccia Serializable.

  • Crea unFileOutputStreamOggetto che rappresenta il file in cui verrà memorizzato l'oggetto (path astratto).

  • Passando l'oggetto creato sopraFileOutputStreamOggetto per creare l'oggetto ObjectOutputStream.

  • Scrivi l'oggetto nel file utilizzando il metodo writeObject().

Deserializza l'oggetto

  • Crea unFileInputStreamOggetto, che rappresenta il file che contiene l'oggetto serializzato.

  • Leggi l'oggetto dal file utilizzando il metodo readObject().

  • Utilizzare l'oggetto recuperato.

Variabili nell'oggetto deserializzato

Quando deserializziamo solo un oggetto, le variabili di istanza verranno salvate e avranno lo stesso valore dopo il processo.

Variabile transitoria  - Non verrà mai consideratoVariabile transitoriaIl valore (escludendolo dal processo di serializzazione). Ad esempio, quando dichiariamo una variabile transitoria, dopo la deserializzazione, il suo valore sarà sempre null, false o zero (valore predefinito).

Variabili statiche  - Non verranno mantenute durante il processo di deserializzazione.Variabili statichedei valori. Di fatto, le variabili statiche non vengono serializzate, ma poiché appartengono alla classe. Dopo la deserializzazione, prendono il valore attuale dalla classe.

Esempio

In questo programma, abbiamo cambiato i valori dell'istanza, le variabili statiche e transient della classe prima della deserializzazione.

Dopo questo processo, i valori delle variabili d'istanza saranno gli stessi. Le variabili temporanee mostrano i valori di default, mentre le variabili statiche mostrano i nuovi (attuali) valori della classe.

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{
      //Creazione di un oggetto Student
      Student std = new Student("Vani", 27);
      //Serializzazione dell'oggetto
      FileOutputStream fos = new FileOutputStream("e:\\student.ser");
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(std);
      oos.close();
      fos.close();
      //Stampa dei dati prima della de-serializzazione
      System.out.println("Valore prima del de-serializzazione: ");
      std.display();
      //Modifica del valore della variabile statica
      std.setYear(2019);
      //Modifica del valore della variabile istanziata
      std.setName("Varada");
      //Modifica del valore della variabile transitoria
      std.setAge(19);
      System.out.println("Oggetto serializzato……");
      //De-serializzazione dell'oggetto
      FileInputStream fis = new FileInputStream("e:\\student.ser");
      ObjectInputStream ois = new ObjectInputStream(fis);
      Student deSerializedStd = (Student) ois.readObject();
      System.out.println("Oggetto de-serializzato……");
      ois.close();
      fis.close();
      System.out.println("Valore de-serializzato: ");
      deSerializedStd.display();
   }
}

Risultato dell'output

Valore prima del de-serializzazione:
Nome: Vani
Età: 27
Anno: 2018
Oggetto serializzato……
Oggetto de-serializzato……
Valore de-serializzato:
Nome: Vani
Età: 0
Anno: 2019