- Serializācija
- Serializējams interfeiss
- Serializācijas piemērs
- Deserializācijas piemērs
- Serializācija ar mantojumu
- Externalizable interfeiss
- 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.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
Metode | Apraksts |
---|---|
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
Metode | Apraksts |
---|---|
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:
successlejupielā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 ravilejupielā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:
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; } }