Serializzazione in Java

La serializzazione in Java è un meccanismo che converte lo stato di un oggetto in un flusso di byte. La deserializzazione è il suo processo inverso. Tramite la deserializzazione, da un flusso di byte, viene creato nella memoria l'oggetto Java reale. Tale meccanismo persiste l'oggetto.

Il flusso di byte così creato dalla serializzazione non dipende da nessuna piattaforma. L'oggetto serializzato su una piattaforma può essere deserializzato su qualsiasi altra piattaforma senza alcun problema. Pertanto, l'intero processo di serializzazione e deserializzazione è indipendente da JVM.

Se un oggetto di classe deve essere serializzato, è necessario implementare l'interfaccia java.io.Serializable. Serializable in java è un'interfaccia marker. Non ha campi o metodi da implementare. Una classe è resa serializzabile da questo processo che assomiglia a un processo Opt-In.

La serializzazione in Java è implementata dalle due classi ObjectInputStream e ObjectOutputStream.

Tutto ciò che serve è un wrapper su di loro in modo che possa essere salvato su file o possa essere inviato su una rete.

Il concetto di serializzazione in Java

La classe ObjectOutputStream che è la classe di serializzazione come menzionato nella sezione precedente contiene diversi metodi di scrittura per la scrittura di vari tipi di dati, ma uno è il più popolare

public final void writeObject(Object x) throws IOException

Il metodo sopra può essere utilizzato per serializzare un oggetto. Questo metodo lo invia anche al flusso di output. Allo stesso modo, la classe ObjectInputStream contiene il metodo per la deserializzazione degli oggetti

public final Object readObject() throws IOException, ClassNotFoundException

Il metodo di deserializzazione recupera l'oggetto da un flusso e deserializza lo stesso. Il valore restituito è di nuovo un oggetto, quindi è sufficiente lanciarlo nel tipo di dati rilevante.

Affinché una classe venga serializzata correttamente, ci sono due condizioni che devono essere soddisfatte:

  • io. L'interfaccia serializzabile deve essere implementata dalla classe.
  • Tutti i campi della classe devono essere serializzabili. Se anche un solo campo non è serializzabile, dovrebbe essere contrassegnato come transitorio.

Se qualcuno deve verificare se una classe è serializzabile o meno, la soluzione semplice è verificare se la classe implementa il metodo java.io.Serializable, se lo fa è serializzabile in caso contrario, quindi non lo è.

Si dovrebbe notare che durante la serializzazione di un oggetto in un file, la pratica standard è di assegnare al file un'estensione .ser.

Metodo di serializzazione in Java

Se questi metodi sono presenti nella classe, vengono utilizzati per la serializzazione a scopi Java.

Metodo Descrizione
public final void writeObject (Object obj) genera IOException ()Questo scriverà l'oggetto specificato su ObjectOutputStream.
public void flush () genera IOException ()Ciò eliminerà il flusso di output corrente.
public void close () genera IOException ()Ciò chiuderà il flusso di output corrente.

Metodo di deserializzazione in Java

Metodo Descrizione
oggetto pubblico finale readObject () genera IOException, ClassNotFoundException ()Questo leggerà un oggetto dal flusso di input.
public void close () genera IOException ()Ciò chiuderà ObjectInputStream.

Esempi di serializzazione in Java

In questa sezione, abbiamo discusso della serializzazione in Java con esempi.

Un esempio in Java è fornito qui per dimostrare come funziona la serializzazione in Java. Creiamo una classe Employee per studiare alcune funzionalità e il codice per lo stesso viene fornito di seguito. Questa classe di dipendenti implementa l'interfaccia serializzabile.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Al termine dell'esecuzione di questo programma, verrà creato un file denominato employee.ser. Questo programma non fornisce risultati garantiti, ma solo a scopo esplicativo e l'obiettivo è comprenderne l'uso e il funzionamento.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

Il programma DeserializeDemo descritto di seguito deserializza l'oggetto Employee sopra creato nel programma Demo Serialize .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

Il codice precedente produrrà il seguente risultato:

Produzione

Dipendente deserializzato …

Nome: Rahul Jain

Indirizzo: epip, Bangalore

SSN: 0

Numero: 131

Di seguito sono riportati alcuni punti importanti relativi al programma di cui sopra -

  • Il blocco try / catch sopra tenta di catturare ClassNotFoundException. Questo è dichiarato dal metodo readObject ().
  • Una JVM può deserializzare un oggetto, solo se trova il bytecode per la classe.
  • Se la JVM non trova una classe durante la deserializzazione, genererà ClassNotFoundException.
  • il valore restituito di readObject () viene sempre trasmesso a un riferimento Employee.
  • Il valore del campo SSN era inizialmente 114433 quando l'oggetto è stato serializzato, ma poiché questo valore non è stato inviato al flusso di output. Per lo stesso motivo, l'oggetto campo SSN Employer deserializzato è 0.

Conclusione

Sopra, abbiamo introdotto concetti di serializzazione e fornito esempi. Comprendiamo la necessità di serializzare come le nostre osservazioni conclusive.

  • Comunicazione: se due macchine che eseguono lo stesso codice devono comunicare facilmente, è che una macchina dovrebbe costruire un oggetto contenente informazioni che avrebbe trasmesso e quindi serializzare quell'oggetto prima di inviarlo all'altra macchina. Non è un ottimo metodo, ma ottiene il lavoro fatto.
  • Persistenza: se lo stato dell'operazione deve essere archiviato in un database, viene prima serializzato in una matrice di byte e quindi archiviato nel database per il recupero in un secondo momento.
  • Deep Copy: se è necessario creare una replica esatta di un oggetto e scrivere una classe di cloni specializzata è troppo duro, allora serializzare l'oggetto e poi de-serializzare su un altro oggetto raggiungerà l'obiettivo.
  • Sincronizzazione JVM incrociata: è possibile sincronizzare diverse JVM in esecuzione su macchine e architetture diverse.

Articoli consigliati

Questa è stata una guida alla serializzazione in Java. Qui abbiamo discusso i diversi metodi di serializzazione in Java con esempi. Puoi anche leggere il seguente articolo per saperne di più -

  1. Domande per l'intervista allo sviluppatore Java
  2. Elenco Java vs Elenco array
  3. Usi di JavaScript

Categoria: