logo

Serializácia a deserializácia v Jave

  1. Serializácia
  2. Serializovateľné rozhranie
  3. Príklad serializácie
  4. Príklad deserializácie
  5. Serializácia s dedičstvom
  6. Externalizovateľné rozhranie
  7. Serializácia a statický dátový člen

Serializácia v Jave je mechanizmus zápis stavu objektu do bajtového toku . Používa sa hlavne v technológiách Hibernate, RMI, JPA, EJB a JMS.

Opačná operácia serializácie sa nazýva deserializácia kde sa byte-stream prevádza na objekt. Proces serializácie a deserializácie je nezávislý od platformy, čo znamená, že objekt môžete serializovať na jednej platforme a deserializovať ho na inej platforme.

Pre serializáciu objektu nazývame writeObject() spôsob ObjectOutputStream triedy a pre deserializáciu nazývame readObject() spôsob ObjectInputStream trieda.

Musíme implementovať Serializovateľné rozhranie na serializáciu objektu.

Výhody serializácie Java

Používa sa hlavne na cestovanie po stave objektu v sieti (to je známe ako zoraďovanie).

serializácia java

java.io.Serializovateľné rozhranie

Serializovateľné je rozhranie markerov (nemá žiadny dátový člen a metódu). Používa sa na „označenie“ tried Java, takže objekty týchto tried môžu získať určitú schopnosť. The Klonovateľné a Diaľkové ovládanie sú tiež rozhrania markerov.

The Serializovateľné rozhranie musí byť implementované triedou, ktorej objekt má byť zachovaný.

Trieda String a všetky obalové triedy implementujú java.io.Serializovateľné rozhranie v predvolenom nastavení.

Pozrime sa na príklad uvedený nižšie:

návrhové vzory v jazyku Java

Študent.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; } } 

Vo vyššie uvedenom príklade Študent trieda implementuje serializovateľné rozhranie. Teraz môžu byť jeho objekty prevedené na prúd. Implementácia hlavnej triedy je uvedená v nasledujúcom kóde.

Trieda ObjectOutputStream

Trieda ObjectOutputStream sa používa na zápis primitívnych dátových typov a objektov Java do OutputStream. Do streamov možno zapisovať iba objekty, ktoré podporujú rozhranie java.io.Serializable.

Konštruktér

1) public ObjectOutputStream(OutputStream out) vyvolá IOException {}Vytvára ObjectOutputStream, ktorý zapisuje do zadaného OutputStream.

Dôležité metódy

zloženie vzťahov
MetódaPopis
1) public final void writeObject(Object obj) vyvolá IOException {}Zapíše zadaný objekt do ObjectOutputStream.
2) public void flush() vyvolá IOException {}Prepláchne aktuálny výstupný tok.
3) public void close() vyvolá IOException {}Zatvorí aktuálny výstupný tok.

Trieda ObjectInputStream

ObjectInputStream deserializuje objekty a primitívne údaje zapísané pomocou ObjectOutputStream.

Konštruktér

1) public ObjectInputStream (InputStream in) vyvolá IOException {}Vytvorí ObjectInputStream, ktorý číta zo zadaného InputStream.

Dôležité metódy

MetódaPopis
1) public final Object readObject() vyvolá IOException, ClassNotFoundException{}Číta objekt zo vstupného toku.
2) public void close() vyvolá IOException {}Zatvorí ObjectInputStream.

Príklad serializácie Java

V tomto príklade budeme serializovať objekt Študent triedy z vyššie uvedeného kódu. Metóda writeObject() triedy ObjectOutputStream poskytuje funkčnosť na serializáciu objektu. Stav objektu ukladáme do súboru s názvom 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);} } } 

Výkon:

 success 
stiahnite si tento príklad serializácie

Príklad deserializácie Java

Deserializácia je proces rekonštrukcie objektu zo sériového stavu. Je to reverzná operácia serializácie. Pozrime sa na príklad, kde čítame dáta z deserializovaného objektu.

Deserializácia je proces rekonštrukcie objektu zo sériového stavu. Je to reverzná operácia serializácie. Pozrime sa na príklad, kde čítame dáta z deserializovaného objektu.

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

Výkon:

211 ravi 
stiahnite si tento príklad deserializácie

Serializácia Java s dedičnosťou (vzťah IS-A)

Ak trieda implementuje Serializovateľné rozhranie potom všetky jeho podtriedy budú tiež serializovateľné. Pozrime sa na príklad uvedený nižšie:

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

Výkon:

 success 211 ravi Engineering 50000 

Trieda SerializeISA serializovala objekt triedy Študent, ktorý rozširuje triedu Person, ktorá je serializovateľná. Vlastnosti nadradenej triedy sa dedia na podtriedy, takže ak je nadradená trieda serializovateľná, bude ňou aj podtrieda.

Serializácia Java s agregáciou (vzťah HAS-A)

Ak má trieda odkaz na inú triedu, všetky odkazy musia byť serializovateľné, inak sa proces serializácie nevykoná. V takom prípade NotSerializableException je vyhodený za behu.

Adresa.java

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

Študent.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; } } 

Keďže adresa nie je serializovateľná, nemôžete serializovať inštanciu triedy Študent.

Poznámka: Všetky objekty v objekte musia byť serializovateľné.

Java serializácia so statickým dátovým členom

Ak je v triede nejaký statický dátový člen, nebude serializovaný, pretože statický je časťou triedy, nie objektom.

prevod reťazca na int

Zamestnanec.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ácia s poľom alebo kolekciou

Pravidlo: V prípade poľa alebo kolekcie musia byť všetky objekty poľa alebo kolekcie serializovateľné. Ak niektorý objekt nie je možné serializovať, serializácia zlyhá.

nudné nuly

Externalizovateľné v jazyku Java

Externalizovateľné rozhranie poskytuje možnosť zapisovania stavu objektu do bajtového toku v komprimovanom formáte. Nie je to rozhranie značky.

Externalizovateľné rozhranie poskytuje dva spôsoby:

    public void writeExternal(ObjectOutput out) vyvolá IOException public void readExternal(ObjectInput in) vyvolá IOException

Prechodné kľúčové slovo Java

Ak nechcete serializovať žiadny údajový člen triedy, môžete ho označiť ako prechodný.

Zamestnanec.java

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

Teraz sa id nebude serializovať, takže keď deserializujete objekt po serializácii, nezískate hodnotu id. Vždy vráti predvolenú hodnotu. V takom prípade vráti 0, pretože dátový typ id je celé číslo.

Ďalšie podrobnosti nájdete na ďalšej stránke.

SerialVersionUID

Proces serializácie za behu priraďuje ID ku každej serializovateľnej triede, ktorá je známa ako SerialVersionUID. Používa sa na overenie odosielateľa a príjemcu serializovaného objektu. Odosielateľ a príjemca musia byť rovnakí. Na overenie sa používa SerialVersionUID. Odosielateľ a príjemca musia mať rovnaký SerialVersionUID, inak InvalidClassException bude vyhodený, keď objekt deserializujete. Môžeme tiež deklarovať naše vlastné SerialVersionUID v triede Serializable. Ak to chcete urobiť, musíte vytvoriť pole SerialVersionUID a priradiť mu hodnotu. Musí byť dlhého typu so statickým a konečným. Odporúča sa explicitne deklarovať pole serialVersionUID v triede a mať ho tiež súkromné. Napríklad:

 private static final long serialVersionUID=1L; 

Teraz bude trieda Serializable vyzerať takto:

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