- Serializácia
- Serializovateľné rozhranie
- Príklad serializácie
- Príklad deserializácie
- Serializácia s dedičstvom
- Externalizovateľné rozhranie
- 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).
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óda | Popis |
---|---|
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óda | Popis |
---|---|
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:
successstiahnite 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 ravistiahnite 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:
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; } }