logo

Serializācija un deserializācija Java

  1. Serializācija
  2. Serializējams interfeiss
  3. Serializācijas piemērs
  4. Deserializācijas piemērs
  5. Serializācija ar mantojumu
  6. Externalizable interfeiss
  7. Serializācijas un statisko datu dalībnieks

Serializācija Java ir mehānisms objekta stāvokļa rakstīšana baitu plūsmā . To galvenokārt izmanto Hibernate, RMI, JPA, EJB un JMS tehnoloģijās.

Tiek saukta serializācijas apgrieztā darbība deserializācija kur baitu plūsma tiek pārveidota par objektu. Serializācijas un deserializācijas process ir neatkarīgs no platformas, tas nozīmē, ka varat serializēt objektu vienā platformā un deserializēt to citā platformā.

Objekta serializēšanai mēs saucam par writeObject() metode ObjectOutputStream klasē, un deserializācijai mēs saucam par lasīt objektu () metode ObjectInputStream klasē.

Mums ir jāīsteno Serializējams interfeiss objekta serializēšanai.

Java serializācijas priekšrocības

To galvenokārt izmanto, lai pārvietotu objekta stāvokli tīklā (to sauc par šķirošanu).

java serializācija

java.io.Serializējams interfeiss

Serializējams ir marķiera saskarne (nav datu elementa un metodes). To izmanto, lai 'atzīmētu' Java klases, lai šo klašu objekti varētu iegūt noteiktu iespēju. The Klonējams un Tālvadības pults ir arī marķieru saskarnes.

The Serializējams saskarne ir jāīsteno klasei, kuras objekts ir jāturpina.

Stīgu klase un visas iesaiņojuma klases īsteno java.io.Serializējams interfeiss pēc noklusējuma.

Apskatīsim tālāk sniegto piemēru:

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

Iepriekš minētajā piemērā Students klase ievieš Serializējamo saskarni. Tagad tā objektus var pārvērst straumē. Galvenās klases ieviešana ir parādīta nākamajā kodā.

ObjectOutputStream klase

ObjectOutputStream klase tiek izmantota, lai OutputStream ierakstītu primitīvus datu tipus un Java objektus. Plūsmās var ierakstīt tikai objektus, kas atbalsta interfeisu java.io.Serializable.

Konstruktors

k tuvākais kaimiņš
1) publiskais ObjectOutputStream(OutputStream out) izmet IOException {}Tas izveido ObjectOutputStream, kas raksta norādītajā OutputStream.

Svarīgas metodes

MetodeApraksts
1) publiska galīgā spēkā esamība writeObject(Object obj) izmet IOException {}Tas ieraksta norādīto objektu ObjectOutputStream.
2) public void flush() izmet IOException {}Tas izskalo pašreizējo izvades plūsmu.
3) public void close() izmet IOException {}Tas aizver pašreizējo izvades plūsmu.

ObjectInputStream klase

ObjectInputStream deserializē objektus un primitīvus datus, kas rakstīti, izmantojot ObjectOutputStream.

Konstruktors

1) publiskais ObjectInputStream(InputStream in) izmet IOException {}Tas izveido ObjectInputStream, kas lasa no norādītās InputStream.

Svarīgas metodes

MetodeApraksts
1) publisks galīgais objekts readObject() izmet IOException, ClassNotFoundException{}Tas nolasa objektu no ievades straumes.
2) public void close() izmet IOException {}Tas aizver ObjectInputStream.

Java serializācijas piemērs

Šajā piemērā mēs serializēsim objektu Students klase no augšas koda. ObjectOutputStream klases metode writeObject() nodrošina objekta serializācijas funkcionalitāti. Mēs saglabājam objekta stāvokli failā ar nosaukumu f.txt.

fmoviez

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

Izvade:

 success 
lejupielādējiet šo serializācijas piemēru

Java deserializācijas piemērs

Deserializācija ir objekta rekonstrukcijas process no serializētā stāvokļa. Tā ir serializācijas apgrieztā darbība. Apskatīsim piemēru, kurā mēs nolasām datus no deserializēta objekta.

Deserializācija ir objekta rekonstrukcijas process no serializētā stāvokļa. Tā ir serializācijas apgrieztā darbība. Apskatīsim piemēru, kurā mēs nolasām datus no deserializēta objekta.

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

Izvade:

211 ravi 
lejupielādējiet šo deserializācijas piemēru

Java serializācija ar mantošanu (IS-A attiecības)

Ja klase īsteno Serializējams interfeiss tad arī visas tās apakšklases būs serializējamas. Apskatīsim tālāk sniegto piemēru:

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

Izvade:

 success 211 ravi Engineering 50000 

Klase SerializeISA ir serializējusi Studentu klases objektu, kas paplašina serializējamo personu klasi. Vecākklases rekvizīti tiek mantoti apakšklasēm, tāpēc, ja vecākklase ir Serializējama, tā būtu arī apakšklase.

Java serializācija ar apkopošanu (HAS-A saistība)

Ja klasei ir atsauce uz citu klasi, visām atsaucēm jābūt serializējamām, pretējā gadījumā serializācijas process netiks veikts. Tādā gadījumā, NotSerializableException tiek izmests izpildlaikā.

virkne char

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

Tā kā adrese nav serializējama, nevar serializēt studentu klases gadījumu.

Piezīme. Visiem objektā esošajiem objektiem jābūt serializējamiem.

Java serializācija ar statisko datu dalībnieku

Ja klasē ir kāds statisks datu dalībnieks, tas netiks serializēts, jo statiskais ir klases daļa, nevis objekts.

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

Java serializācija ar masīvu vai kolekciju

Noteikums: masīva vai kolekcijas gadījumā visiem masīva vai kolekcijas objektiem jābūt serializējamiem. Ja kāds objekts nav serializējams, serializācija neizdosies.

Eksternalizējams Java

Externalizable interfeiss nodrošina iespēju ierakstīt objekta stāvokli baitu straumē kompresijas formātā. Tas nav marķiera interfeiss.

Externalizable interfeiss nodrošina divas metodes:

    public Void writeExternal(ObjectOutput out) izmet IOException public void readExternal(ObjectInput in) izmet IOException

Java pārejošs atslēgvārds

Ja nevēlaties serializēt nevienu klases datu dalībnieku, varat to atzīmēt kā pārejošu.

Darbinieks.java

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

Tagad id netiks serializēts, tāpēc, veicot objekta serializāciju pēc serializācijas, jūs nesaņemsit id vērtību. Tas vienmēr atgriezīs noklusējuma vērtību. Šādā gadījumā tas atgriezīs 0, jo id datu tips ir vesels skaitlis.

Apmeklējiet nākamo lapu, lai iegūtu sīkāku informāciju.

SerialVersionUID

Serializācijas process izpildlaikā saista ID ar katru serializējamo klasi, kas ir pazīstama kā SerialVersionUID. To izmanto, lai pārbaudītu serializētā objekta sūtītāju un saņēmēju. Sūtītājam un saņēmējam jābūt vienam un tam pašam. Lai to pārbaudītu, tiek izmantots SerialVersionUID. Sūtītājam un saņēmējam ir jābūt vienam un tam pašam SerialVersionUID, pretējā gadījumā InvalidClassException tiks izmests, kad deserializēsit objektu. Mēs varam arī deklarēt savu SerialVersionUID klasē Serializable. Lai to izdarītu, jums ir jāizveido lauks SerialVersionUID un jāpiešķir tam vērtība. Tam jābūt gara tipa ar statisku un galīgu. Ir ieteicams klasē skaidri deklarēt lauku serialVersionUID un nodrošināt to arī kā privātu. Piemēram:

 private static final long serialVersionUID=1L; 

Tagad Serializējamā klase izskatīsies šādi:

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