logo

Serializarea și deserializarea în Java

  1. Serializare
  2. Interfață serializabilă
  3. Exemplu de serializare
  4. Exemplu de deserializare
  5. Serializarea cu moștenire
  6. Interfață externabilă
  7. Serializare și membru de date statice

Serializare în Java este un mecanism de scrierea stării unui obiect într-un flux de octeți . Este folosit în principal în tehnologiile Hibernate, RMI, JPA, EJB și JMS.

Operația inversă a serializării este numită deserializare unde byte-stream este convertit într-un obiect. Procesul de serializare și deserializare este independent de platformă, înseamnă că puteți serializa un obiect pe o platformă și îl puteți deserializa pe o altă platformă.

Pentru serializarea obiectului, numim scrieObject() Metodă de ObjectOutputStream clasa, iar pentru deserializare numim readObject() Metodă de ObjectInputStream clasă.

Trebuie să punem în aplicare Serializabil interfață pentru serializarea obiectului.

Avantajele serializării Java

Este folosit în principal pentru a călători starea obiectului în rețea (care este cunoscută sub numele de marshalling).

vlc descărca youtube
serializare java

java.io.Interfață serializabilă

Serializabil este o interfață de marcare (nu are membru de date și metodă). Este folosit pentru a „marca” clasele Java, astfel încât obiectele acestor clase să aibă o anumită capacitate. The Clonabil și la distanta sunt și interfețe de marcare.

The Serializabil interfața trebuie implementată de clasa al cărei obiect trebuie să fie persistent.

Clasa String și toate clasele wrapper implementează java.io.Serializabil interfață în mod implicit.

Să vedem exemplul dat mai jos:

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; } } 

În exemplul de mai sus, Student clasa implementeaza interfata serializabila. Acum obiectele sale pot fi convertite în flux. Implementarea clasei principale a este prezentată în codul următor.

Clasa ObjectOutputStream

Clasa ObjectOutputStream este folosită pentru a scrie tipuri de date primitive și obiecte Java într-un OutputStream. Numai obiectele care acceptă interfața java.io.Serializable pot fi scrise în fluxuri.

Constructor

1) public ObjectOutputStream(OutputStream out) aruncă IOException {}Acesta creează un ObjectOutputStream care scrie în OutputStream specificat.

Metode importante

MetodăDescriere
1) public final void writeObject(Object obj) aruncă IOException {}Acesta scrie obiectul specificat în ObjectOutputStream.
2) public void flush() aruncă IOException {}Spălește fluxul de ieșire curent.
3) public void close() aruncă IOException {}Închide fluxul de ieșire curent.

Clasa ObjectInputStream

Un ObjectInputStream deserializează obiectele și datele primitive scrise folosind un ObjectOutputStream.

Constructor

1) public ObjectInputStream(InputStream in) aruncă IOException {}Acesta creează un ObjectInputStream care citește din InputStream specificat.

Metode importante

obține data curentă în java
MetodăDescriere
1) obiectul final public readObject() aruncă IOException, ClassNotFoundException{}Citește un obiect din fluxul de intrare.
2) public void close() aruncă IOException {}Închide ObjectInputStream.

Exemplu de serializare Java

În acest exemplu, vom serializa obiectul Student clasa din codul de mai sus. Metoda writeObject() a clasei ObjectOutputStream oferă funcționalitatea de a serializa obiectul. Salvăm starea obiectului în fișierul numit 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);} } } 

Ieșire:

 success 
descărcați acest exemplu de serializare

Exemplu de deserializare Java

Deserializarea este procesul de reconstrucție a obiectului din starea serializată. Este operația inversă a serializării. Să vedem un exemplu în care citim datele dintr-un obiect deserializat.

Deserializarea este procesul de reconstrucție a obiectului din starea serializată. Este operația inversă a serializării. Să vedem un exemplu în care citim datele dintr-un obiect deserializat.

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);} } } 

Ieșire:

211 ravi 
descărcați acest exemplu de deserializare

Serializare Java cu moștenire (relație IS-A)

Dacă o clasă implementează Interfață serializabilă atunci toate subclasele sale vor fi, de asemenea, serializabile. Să vedem exemplul dat mai jos:

arraylist sortat java

SerializeISA.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);} } } 

Ieșire:

 success 211 ravi Engineering 50000 

Clasa SerializeISA a serializat obiectul clasei Student care extinde clasa Persoană care este Serializabil. Proprietățile clasei părinte sunt moștenite de subclase, așa că dacă clasa părinte este Serializabil, subclasa ar fi, de asemenea.

Serializare Java cu agregare (relație HAS-A)

Dacă o clasă are o referință la o altă clasă, toate referințele trebuie să fie serializabile, altfel procesul de serializare nu va fi efectuat. In acest caz, NotSerializableException este aruncat în timpul rulării.

Adresă.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; } } 

Deoarece Adresa nu este serializabilă, nu puteți serializa instanța clasei Student.

Notă: Toate obiectele dintr-un obiect trebuie să fie serializabile.

Serializare Java cu membrul de date static

Dacă există vreun membru de date statice într-o clasă, acesta nu va fi serializat deoarece static este partea din clasă, nu obiect.

Angajat.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; } } 

Serializare Java cu matrice sau colecție

Regulă: În cazul matricei sau colecției, toate obiectele matricei sau colecției trebuie să fie serializabile. Dacă orice obiect nu este serializabil, serializarea va fi eșuată.

Externalizabil în java

Interfața Externalizabil oferă facilitatea de a scrie starea unui obiect într-un flux de octeți în format comprimat. Nu este o interfață de marcare.

Interfața Externalizabil oferă două metode:

    public void writeExternal(ObjectOutput out) aruncă IOException public void readExternal(ObjectInput in) aruncă IOException

Cuvânt cheie tranzitoriu Java

Dacă nu doriți să serializați niciun membru de date al unei clase, îl puteți marca ca tranzitorie.

Angajat.java

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

Acum, id-ul nu va fi serializat, așa că atunci când deserializați obiectul după serializare, nu veți obține valoarea id. Va returna întotdeauna valoarea implicită. În acest caz, va returna 0 deoarece tipul de date al id este un număr întreg.

Vizitați pagina următoare pentru mai multe detalii.

SerialVersionUID

Procesul de serializare în timpul execuției asociază un id cu fiecare clasă Serializable, care este cunoscut sub numele de SerialVersionUID. Este folosit pentru a verifica expeditorul și destinatarul obiectului serializat. Emițătorul și destinatarul trebuie să fie același. Pentru a-l verifica, se folosește SerialVersionUID. Expeditorul și destinatarul trebuie să aibă același SerialVersionUID, în caz contrar, InvalidClassException va fi aruncat atunci când deserializați obiectul. De asemenea, putem declara propriul nostru SerialVersionUID în clasa Serializable. Pentru a face acest lucru, trebuie să creați un câmp SerialVersionUID și să îi atribuiți o valoare. Trebuie să fie de tip lung cu static și final. Se sugerează să declarați în mod explicit câmpul serialVersionUID din clasă și să îl aveți și privat. De exemplu:

emoji-uri iPhone pe Android
 private static final long serialVersionUID=1L; 

Acum, clasa Serializable va arăta astfel:

Angajat.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; } }