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

Viene chiamato il costruttore dell'oggetto durante la deserializzazione in Java?

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-

  • Assicurarsi che la classe implementi l'interfaccia Serializable.

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

  • Tramite la trasmissione delFileOutputStreamOggetto per creare un ObjectOutputStream.

  • Utilizzare il metodo writeObject() per scrivere un oggetto nel file.

Deserializzare l'oggetto

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

  • Utilizzare il metodo readObject() per leggere un oggetto dal file.

  • Utilizzare l'oggetto recuperato.

ACostruzione È un metodo simile e viene chiamato quando si crea un oggetto della classe. Solitamente viene utilizzato per inizializzare le variabili di unaistanza di una classe. Il costruttore ha lo stesso nome della classe e non ha un tipo di ritorno.
Se non viene fornito un costruttore, il compilatore definisce automaticamente un costruttore per voi, che inizializzerà le variabili d'istanza con valori predefiniti.

Costruttore e deserializzazione

Quando deserializziamo un oggetto, mai chiamiamo il costruttore della sua classe. Consideriamo l'esempio seguente, qui c'è una classe chiamata Student con due variabili d'istanza e un costruttore predefinito (inizializzato con due valori hardcodati) e un costruttore parametrizzato.

Il metodo display() di questa classe mostra i valori delle variabili dell'istanza corrente.
Creiamo un oggetto della classe Student passando due valori (vani e 27) e serializzandoli.
Quando deserializziamo questo oggetto e chiamiamo il metodo display(), verranno stampati i valori che abbiamo trasmesso. Le variabili statiche stamperanno il nuovo (corrente) valore della classe.

Esempio

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{
      //Crea 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 deserializzazione
      System.out.println("Valore prima della deserializzazione");
      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 transitiva
      std.setAge(19);
      System.out.println("Oggetto serializzato......");
      //Deserializzazione 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 deserializzato");
      deSerializedStd.display();
   }
}

Risultato di output

Valore prima della deserializzazione
Nome: Vani
Età: 27
Anno: 2018
Oggetto serializzato......
Oggetto de-serializzato......
Valore deserializzato
Nome: Vani
Età: 0
Anno: 2019