logo

Serializavimas ir deserializavimas Java

  1. Serializavimas
  2. Serializuojama sąsaja
  3. Serializacijos pavyzdys
  4. Deserializacijos pavyzdys
  5. Serializavimas su paveldėjimu
  6. Išorinė sąsaja
  7. Serializavimo ir statinių duomenų narys

Serializavimas Java yra mechanizmas objekto būsenos įrašymas į baitų srautą . Jis daugiausia naudojamas Hibernate, RMI, JPA, EJB ir JMS technologijose.

Vadinamas atvirkštinis serializacijos veiksmas deserializacija kur baitų srautas paverčiamas objektu. Serializavimo ir serializacijos procesas nepriklauso nuo platformos, tai reiškia, kad galite nuosekliai kelti objektą vienoje platformoje ir deserializuoti jį kitoje platformoje.

Objekto serializavimui mes vadiname writeObject() metodas „ObjectOutputStream“. klasėje, o deserializacijai vadiname readObject() metodas „ObjectInputStream“. klasė.

Turime įgyvendinti Serializuojama sąsaja objekto serializavimui.

Java serializavimo privalumai

Jis daugiausia naudojamas objekto būsenai tinkle keliauti (tai žinoma kaip rūšiavimas).

Java serializavimas

java.io.Serializuojama sąsaja

Serializuojama yra žymeklio sąsaja (neturi duomenų nario ir metodo). Jis naudojamas Java klasėms 'žymėti', kad šių klasių objektai įgytų tam tikrą galimybę. The Galima klonuoti ir Nuotolinis taip pat yra žymeklio sąsajos.

The Serializuojama sąsają turi įgyvendinti klasė, kurios objektas turi būti išlaikytas.

Styginių klasė ir visos įvyniojimo klasės įgyvendina java.io.Serializuojama sąsaja pagal numatytuosius nustatymus.

Pažiūrėkime toliau pateiktą pavyzdį:

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

Aukščiau pateiktame pavyzdyje Studentas klasė įgyvendina Serializable sąsają. Dabar jo objektus galima paversti srautu. Pagrindinės klasės įgyvendinimas parodytas kitame kode.

ObjectOutputStream klasė

„ObjectOutputStream“ klasė naudojama primityviems duomenų tipams ir „Java“ objektams įrašyti į „OutputStream“. Į srautus galima įrašyti tik objektus, kurie palaiko java.io.Serializable sąsają.

Konstruktorius

1) vieša ObjectOutputStream (OutputStream out) išmeta IOException {}Jis sukuria ObjectOutputStream, kuris rašo į nurodytą OutputStream.

Svarbūs metodai

Word greitosios prieigos įrankių juosta
Metodasapibūdinimas
1) viešas galutinis void writeObject(Object Obj) meta IOException {}Jis įrašo nurodytą objektą į ObjectOutputStream.
2) public void flush() išmeta IOException {}Jis išplauna dabartinį išvesties srautą.
3) viešasis void close() meta IOException {}Jis uždaro dabartinį išvesties srautą.

ObjectInputStream klasė

„ObjectInputStream“ deserializuoja objektus ir primityvius duomenis, įrašytus naudojant „ObjectOutputStream“.

Konstruktorius

1) viešas ObjectInputStream(InputStream in) meta IOException {}Jis sukuria ObjectInputStream, kuris nuskaito iš nurodytos InputStream.

Svarbūs metodai

Metodasapibūdinimas
1) viešas galutinis Object readObject() meta IOException, ClassNotFoundException{}Jis nuskaito objektą iš įvesties srauto.
2) viešasis void close() meta IOException {}Jis uždaro „ObjectInputStream“.

Java serializacijos pavyzdys

Šiame pavyzdyje mes ketiname suskirstyti objektą Studentas klasė iš aukščiau esančio kodo. ObjectOutputStream klasės metodas writeObject() suteikia objekto nuoseklumo funkciją. Išsaugome objekto būseną faile pavadinimu 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);} } } 

Išvestis:

 success 
atsisiųskite šį serializavimo pavyzdį

Java deserializacijos pavyzdys

Deserializavimas yra objekto atkūrimo iš serijinės būsenos procesas. Tai atvirkštinė serializacijos operacija. Pažiūrėkime pavyzdį, kai skaitome duomenis iš deserializuoto objekto.

Deserializavimas yra objekto atkūrimo iš serijinės būsenos procesas. Tai atvirkštinė serializacijos operacija. Pažiūrėkime pavyzdį, kai skaitome duomenis iš deserializuoto objekto.

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

Išvestis:

latekso sąrašai
211 ravi 
atsisiųskite šį deserializacijos pavyzdį

Java serializavimas su paveldėjimu (IS-A ryšys)

Jei klasė įgyvendina Serializuojama sąsaja tada visos jo poklasės taip pat bus serializuojamos. Pažiūrėkime toliau pateiktą pavyzdį:

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

Išvestis:

 success 211 ravi Engineering 50000 

SerializeISA klasė suserializavo Studento klasės objektą, kuris išplečia asmeninę klasę, kuri yra serializuojama. Pirminės klasės ypatybės yra paveldimos poklasiams, taigi, jei pagrindinė klasė yra serializuojama, poklasis taip pat bus.

Java serializavimas su agregavimu (HAS-A ryšys)

Jei klasėje yra nuoroda į kitą klasę, visos nuorodos turi būti serializuojamos, kitaip serializacijos procesas nebus atliktas. Tokiu atveju, NotSerializableException yra išmestas vykdymo metu.

Adresas.java

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

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

Kadangi adresas nėra serializuojamas, negalite suskirstyti Mokinio klasės egzemplioriaus.

Pastaba: visi objekto objektai turi būti serializuojami.

Java serializavimas su statinių duomenų nariu

Jei klasėje yra koks nors statinis duomenų narys, jis nebus serijinis, nes statinis yra klasės dalis, o ne objektas.

Darbuotojas.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 serializavimas naudojant masyvą arba rinkinį

Taisyklė: masyvo arba kolekcijos atveju visi masyvo ar kolekcijos objektai turi būti nuoseklūs. Jei kurio nors objekto negalima serializuoti, serializuoti nepavyks.

Galima naudoti java

Išorinė sąsaja suteikia galimybę įrašyti objekto būseną į baitų srautą suspaudimo formatu. Tai nėra žymeklio sąsaja.

Išorinė sąsaja siūlo du būdus:

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

„Java“ trumpalaikis raktinis žodis

Jei nenorite nuosekliai sudaryti jokio klasės duomenų nario, galite pažymėti jį kaip trumpalaikį.

Darbuotojas.java

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

Dabar id nebus serializuotas, todėl serializuodami objektą po serializacijos negausite id reikšmės. Jis visada grąžins numatytąją vertę. Tokiu atveju jis grąžins 0, nes ID duomenų tipas yra sveikasis skaičius.

Norėdami gauti daugiau informacijos, apsilankykite kitame puslapyje.

SerialVersionUID

Serializacijos procesas vykdymo metu susieja ID su kiekviena serializuojama klase, kuri žinoma kaip SerialVersionUID. Jis naudojamas serializuoto objekto siuntėjui ir gavėjui patikrinti. Siuntėjas ir gavėjas turi būti tas pats. Norėdami jį patikrinti, naudojamas SerialVersionUID. Siuntėjas ir gavėjas turi turėti tą patį SerialVersionUID, kitaip InvalidClassException bus išmestas, kai deserializuosite objektą. Mes taip pat galime deklaruoti savo SerialVersionUID klasėje Serializable. Norėdami tai padaryti, turite sukurti lauką SerialVersionUID ir priskirti jam reikšmę. Jis turi būti ilgo tipo, statinis ir galutinis. Siūloma klasėje aiškiai deklaruoti lauką serialVersionUID ir taip pat laikyti jį privatų. Pavyzdžiui:

 private static final long serialVersionUID=1L; 

Dabar Serializable klasė atrodys taip:

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