- Serializzazione
- Interfaccia serializzabile
- Esempio di serializzazione
- Esempio di deserializzazione
- Serializzazione con ereditarietà
- Interfaccia esternalizzabile
- 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).
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
Metodo | Descrizione |
---|---|
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
Metodo | Descrizione |
---|---|
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:
successscarica 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 raviscarica 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:
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; } }