- Serializavimas
- Serializuojama sąsaja
- Serializacijos pavyzdys
- Deserializacijos pavyzdys
- Serializavimas su paveldėjimu
- Išorinė sąsaja
- 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.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
Metodas | apibū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
Metodas | apibū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:
successatsisių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 raviatsisių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:
„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; } }