logo

Serializzazione e deserializzazione in Java

  1. Serializzazione
  2. Interfaccia serializzabile
  3. Esempio di serializzazione
  4. Esempio di deserializzazione
  5. Serializzazione con ereditarietà
  6. Interfaccia esternalizzabile
  7. Serializzazione e membro dati statici

Serializzazione in Java è un meccanismo di scrivere lo stato di un oggetto in un flusso di byte . Viene utilizzato principalmente nelle tecnologie Hibernate, RMI, JPA, EJB e JMS.

Viene chiamata l'operazione inversa della serializzazione deserializzazione dove il flusso di byte viene convertito in un oggetto. Il processo di serializzazione e deserializzazione è indipendente dalla piattaforma, ciò significa che puoi serializzare un oggetto su una piattaforma e deserializzarlo su una piattaforma diversa.

Per serializzare l'oggetto, chiamiamo the scrivereOggetto() metodo di OggettoOutputStream classe e per la deserializzazione chiamiamo the leggiOggetto() metodo di OggettoInputStream classe.

Dobbiamo dover implementare il Serializzabile interfaccia per serializzare l'oggetto.

Vantaggi della serializzazione Java

Viene utilizzato principalmente per verificare lo stato degli oggetti sulla rete (noto come marshalling).

serializzazione Java

interfaccia java.io.Serializable

Serializzabile è un'interfaccia marcatore (non dispone di membro dati e metodo). Viene utilizzato per 'contrassegnare' le classi Java in modo che gli oggetti di queste classi possano acquisire una determinata capacità. IL Clonabile E A distanza sono anche interfacce marcatori.

annotazioni sugli stivali primaverili

IL Serializzabile l'interfaccia deve essere implementata dalla classe il cui oggetto deve essere persistente.

La classe String e tutte le classi wrapper implementano il file java.io.Serializable interfaccia per impostazione predefinita.

Vediamo l'esempio riportato di seguito:

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Nell'esempio sopra, Alunno la classe implementa l'interfaccia serializzabile. Ora i suoi oggetti possono essere convertiti in stream. L'implementazione della classe principale è mostrata nel codice successivo.

Classe ObjectOutputStream

La classe ObjectOutputStream viene utilizzata per scrivere tipi di dati primitivi e oggetti Java su un OutputStream. Solo gli oggetti che supportano l'interfaccia java.io.Serializable possono essere scritti nei flussi.

Costruttore

1) ObjectOutputStream pubblico (OutputStream out) lancia IOException {}Crea un ObjectOutputStream che scrive nell'OutputStream specificato.

Metodi importanti

MetodoDescrizione
1) public final void writeObject (Object obj) lancia IOException {}Scrive l'oggetto specificato in ObjectOutputStream.
2) public void flush() lancia IOException {}Svuota il flusso di output corrente.
3) public void close() lancia IOException {}Chiude il flusso di output corrente.

Classe ObjectInputStream

Un ObjectInputStream deserializza oggetti e dati primitivi scritti utilizzando un ObjectOutputStream.

Costruttore

differenza tra albero binario e albero di ricerca binario
1) ObjectInputStream pubblico (InputStream in) genera IOException {}Crea un ObjectInputStream che legge dall'InputStream specificato.

Metodi importanti

mylive cricket
MetodoDescrizione
1) L'oggetto finale pubblico readObject() lancia IOException, ClassNotFoundException{}Legge un oggetto dal flusso di input.
2) public void close() lancia IOException {}Chiude ObjectInputStream.

Esempio di serializzazione Java

In questo esempio serializzeremo l'oggetto di Alunno classe dal codice precedente. Il metodo writeObject() della classe ObjectOutputStream fornisce la funzionalità per serializzare l'oggetto. Stiamo salvando lo stato dell'oggetto nel file denominato f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Produzione:

 success 
scarica questo esempio di serializzazione

Esempio di deserializzazione Java

La deserializzazione è il processo di ricostruzione dell'oggetto dallo stato serializzato. È l’operazione inversa della serializzazione. Vediamo un esempio in cui stiamo leggendo i dati da un oggetto deserializzato.

La deserializzazione è il processo di ricostruzione dell'oggetto dallo stato serializzato. È l’operazione inversa della serializzazione. Vediamo un esempio in cui stiamo leggendo i dati da un oggetto deserializzato.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Produzione:

211 ravi 
scarica questo esempio di deserializzazione

Serializzazione Java con ereditarietà (relazione IS-A)

Se una classe implementa Interfaccia serializzabile quindi anche tutte le sue sottoclassi saranno serializzabili. Vediamo l'esempio riportato di seguito:

stringa in Java booleano

SerializzaISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Produzione:

 success 211 ravi Engineering 50000 

La classe SerializeISA ha serializzato l'oggetto della classe Student che estende la classe Person che è Serializable. Le proprietà della classe genitore vengono ereditate dalle sottoclassi, quindi se la classe genitore è serializzabile, anche la sottoclasse lo sarebbe.

Serializzazione Java con aggregazione (relazione HAS-A)

Se una classe ha un riferimento a un'altra classe, tutti i riferimenti devono essere serializzabili altrimenti il ​​processo di serializzazione non verrà eseguito. In tal caso, NotSerializableException viene lanciato in fase di esecuzione.

Indirizzo.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Poiché l'indirizzo non è serializzabile, non è possibile serializzare l'istanza della classe Student.

Nota: tutti gli oggetti all'interno di un oggetto devono essere serializzabili.

Serializzazione Java con il membro dati statico

Se in una classe è presente un membro dati statico, non verrà serializzato perché statico è la parte della classe e non l'oggetto.

Dipendente.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Serializzazione Java con array o raccolta

Regola: in caso di array o raccolta, tutti gli oggetti dell'array o della raccolta devono essere serializzabili. Se un oggetto non è serializzabile, la serializzazione fallirà.

Esternalizzabile in Java

L'interfaccia Externalizable fornisce la possibilità di scrivere lo stato di un oggetto in un flusso di byte in formato compresso. Non è un'interfaccia marcatore.

L'interfaccia Externalizable fornisce due metodi:

    public void writeExternal(ObjectOutput out) genera IOException public void readExternal(ObjectInput in) genera IOException

Parola chiave temporanea Java

Se non desideri serializzare alcun membro dati di una classe, puoi contrassegnarlo come transitorio.

Dipendente.java

imposta in Java
 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Ora, id non verrà serializzato, quindi quando deserializzi l'oggetto dopo la serializzazione, non otterrai il valore di id. Restituirà sempre il valore predefinito. In tal caso, restituirà 0 perché il tipo di dati di id è un numero intero.

Visita la pagina successiva per maggiori dettagli.

SerialVersionUID

Il processo di serializzazione in fase di esecuzione associa un ID a ciascuna classe Serializable nota come SerialVersionUID. Viene utilizzato per verificare il mittente e il destinatario dell'oggetto serializzato. Il mittente e il destinatario devono essere gli stessi. Per verificarlo, viene utilizzato SerialVersionUID. Il mittente e il destinatario devono avere lo stesso SerialVersionUID, altrimenti InvalidClassException verrà generato quando si deserializza l'oggetto. Possiamo anche dichiarare il nostro SerialVersionUID nella classe Serializable. Per fare ciò, è necessario creare un campo SerialVersionUID e assegnargli un valore. Deve essere del tipo lungo con statico e finale. Si consiglia di dichiarare esplicitamente il campo serialVersionUID nella classe e di renderlo anche privato. Per esempio:

 private static final long serialVersionUID=1L; 

Ora, la classe Serializable sarà simile a questa:

Dipendente.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }