logo

Serializácia a deserializácia v Jave s príkladom

Serializácia je mechanizmus prevodu stavu objektu na bajtový tok. Deserializácia je opačný proces, pri ktorom sa bajtový prúd používa na opätovné vytvorenie skutočného objektu Java v pamäti. Tento mechanizmus sa používa na zachovanie objektu. serializovať-deserializovať-java
Vytvorený byte stream je nezávislý od platformy. Takže objekt serializovaný na jednej platforme môže byť deserializovaný na inej platforme. Aby bol objekt Java serializovateľný, implementujeme java.io.Serializovateľné rozhranie. Trieda ObjectOutputStream obsahuje writeObject() metóda na serializáciu objektu.

binárny vyhľadávací strom
public final void writeObject(Object obj)  throws IOException>

Trieda ObjectInputStream obsahuje readObject() metóda deserializácie objektu.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Výhody serializácie



  1. Uložiť/zachovať stav objektu.
  2. Na cestovanie objektom cez sieť.

Serializovať možno len objekty tých tried, ktoré sa implementujú java.io.Serializovateľné rozhranie. Serializovateľný je a 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ť. Ďalšie príklady rozhraní markerov sú: - Klonovateľné a vzdialené.

Body na zapamätanie

1. Ak nadradená trieda implementovala serializovateľné rozhranie, potom ho podriadená trieda nemusí implementovať, ale naopak to neplatí.
2. Prostredníctvom procesu serializácie sa uložia len nestatické dátové členy.
3. Statické dátové členy a prechodné dátové členy sa neuložia prostredníctvom procesu serializácie. Ak teda nechcete uložiť hodnotu nestatického dátového člena, urobte ho prechodným.
4. Konštruktor objektu sa nikdy nevolá, keď je objekt deserializovaný.
5. Pridružené objekty musia implementovať serializovateľné rozhranie. Príklad:

class A implements Serializable{  // B also implements Serializable // interface. B ob=new B();  }>

SerialVersionUID Runtime serializácie spája číslo verzie s každou triedou Serializable nazývanou SerialVersionUID, ktorá sa používa počas deserializácie na overenie, či odosielateľ a príjemca serializovaného objektu načítali triedy pre tento objekt, ktoré sú kompatibilné s ohľadom na serializáciu. Ak príjemca načítal triedu pre objekt, ktorý má iné UID ako má zodpovedajúca trieda odosielateľa, výsledkom deserializácie bude InvalidClassException .

Serializovateľná trieda môže deklarovať svoje vlastné UID explicitne deklarovaním názvu poľa. Musí byť statické, konečné a dlhého typu. t.j.- AKÝKOĽVEK-PRÍSTUPOVÝ-MODIFIKÁTOR statický konečný dlhý seriálVersionUID=42L; Ak serializovateľná trieda explicitne nedeklaruje serialVersionUID, potom serializačný runtime vypočíta predvolenú hodnotu pre túto triedu na základe rôznych aspektov triedy, ako je popísané v špecifikácii Java Object Serialization Specification. Dôrazne sa však odporúča, aby všetky serializovateľné triedy explicitne deklarovali hodnotu serialVersionUID, pretože jej výpočet je vysoko citlivý na detaily triedy, ktoré sa môžu líšiť v závislosti od implementácií kompilátora, akákoľvek zmena triedy alebo použitie iného id môže ovplyvniť serializované údaje. Odporúča sa tiež použiť súkromný modifikátor pre UID, pretože nie je užitočný ako zdedený člen. serialver Serialver je nástroj, ktorý sa dodáva s JDK. Používa sa na získanie čísla serialVersionUID pre triedy Java.

Môžete spustiť nasledujúci príkaz a získať serialVersionUID serialver [-classpath classpath] [-show] [classname…] Príklad 1:

Java




// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Demo>implements> java.io.Serializable> {> >public> int> a;> >public> String b;> >// Default constructor> >public> Demo(>int> a, String b)> >{> >this>.a = a;> >this>.b = b;> >}> }> class> Test> {> >public> static> void> main(String[] args)> >{> >Demo object =>new> Demo(>1>, 'geeksforgeeks');> >String filename = 'file.ser';> > >// Serialization> >try> >{> >//Saving of object in a file> >FileOutputStream file =>new> FileOutputStream(filename);> >ObjectOutputStream out =>new> ObjectOutputStream(file);> > >// Method for serialization of object> >out.writeObject(object);> > >out.close();> >file.close();> > >System.out.println('Object has been serialized');> >}> > >catch>(IOException ex)> >{> >System.out.println('IOException is caught');> >}> >Demo object1 =>null>;> >// Deserialization> >try> >{> >// Reading the object from a file> >FileInputStream file =>new> FileInputStream(filename);> >ObjectInputStream in =>new> ObjectInputStream(file);> > >// Method for deserialization of object> >object1 = (Demo)in.readObject();> > >in.close();> >file.close();> > >System.out.println('Object has been deserialized ');> >System.out.println('a = ' + object1.a);> >System.out.println('b = ' + object1.b);> >}> > >catch>(IOException ex)> >{> >System.out.println('IOException is caught');> >}> > >catch>(ClassNotFoundException ex)> >{> >System.out.println('ClassNotFoundException is caught');> >}> >}> }>

>

>

Výkon :

Object has been serialized Object has been deserialized  a = 1 b = geeksforgeeks>

Príklad 2:

Java




// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Emp>implements> Serializable {> private> static> final> long> serialversionUID => >129348938L;> >transient> int> a;> >static> int> b;> >String name;> >int> age;> >// Default constructor> public> Emp(String name,>int> age,>int> a,>int> b)> >{> >this>.name = name;> >this>.age = age;> >this>.a = a;> >this>.b = b;> >}> }> public> class> SerialExample {> public> static> void> printdata(Emp object1)> >{> >System.out.println('name = ' + object1.name);> >System.out.println('age = ' + object1.age);> >System.out.println('a = ' + object1.a);> >System.out.println('b = ' + object1.b);> >}> public> static> void> main(String[] args)> >{> >Emp object =>new> Emp('ab',>20>,>2>,>1000>);> >String filename = 'shubham.txt';> >// Serialization> >try> {> >// Saving of object in a file> >FileOutputStream file =>new> FileOutputStream> >(filename);> >ObjectOutputStream out =>new> ObjectOutputStream> >(file);> >// Method for serialization of object> >out.writeObject(object);> >out.close();> >file.close();> >System.out.println('Object has been serialized '> >+ 'Data before Deserialization.');> >printdata(object);> >// value of static variable changed> >object.b =>2000>;> >}> >catch> (IOException ex) {> >System.out.println('IOException is caught');> >}> >object =>null>;> >// Deserialization> >try> {> >// Reading the object from a file> >FileInputStream file =>new> FileInputStream> >(filename);> >ObjectInputStream in =>new> ObjectInputStream> >(file);> >// Method for deserialization of object> >object = (Emp)in.readObject();> >in.close();> >file.close();> >System.out.println('Object has been deserialized '> >+ 'Data after Deserialization.');> >printdata(object);> >// System.out.println('z = ' + object1.z);> >}> >catch> (IOException ex) {> >System.out.println('IOException is caught');> >}> >catch> (ClassNotFoundException ex) {> >System.out.println('ClassNotFoundException' +> >' is caught');> >}> >}> }>

>

>

Výkon:

Object has been serialized Data before Deserialization. name = ab age = 20 a = 2 b = 1000 Object has been deserialized Data after Deserialization. name = ab age = 20 a = 0 b = 2000>

Popis pre výstup: Počas deserializácie objektu ste videli, že hodnoty aab sa zmenili. Príčina a bola označená ako prechodná a b bola statická.

V prípade prechodné premenné: - Premenná definovaná pomocou prechodného kľúčového slova nie je serializovaná počas procesu serializácie. Táto premenná bude inicializovaná s predvolenou hodnotou počas deserializácie. (napr.: pre objekty je null, pre int je 0).

V prípade statické premenné: - Premenná definovaná pomocou statického kľúčového slova nie je počas procesu serializácie serializovaná. Do tejto premennej sa počas deserializácie načíta aktuálna hodnota definovaná v triede.

Prechodné vs. finále:
Konečný premenné sa budú podieľať na serializácii priamo svojimi hodnotami.
Preto je zbytočné deklarovať konečnú premennú ako prechodnú.
//prekladač priradí hodnotu konečnej premennej

príklad:

final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, pretože x je konečné. System.out.println(y);//20>

Príklad 3:

Java




//java code for final with transient> import> java.io.*;> class> Dog>implements> Serializable{> >int> i=>10>;> >transient> final> int> j=>20>;> }> class> GFG {> >public> static> void> main (String[] args)>throws> IOException,ClassNotFoundException> >{> >Dog d1=>new> Dog();> >//Serialization started> >System.out.println(>'serialization started'>);> >FileOutputStream fos=>new> FileOutputStream(>'abc.ser'>);> >ObjectOutputStream oos=>new> ObjectOutputStream(fos);> >oos.writeObject(d1);> >System.out.println(>'Serialization ended'>);> > >//Deserialization started> >System.out.println(>'Deserialization started'>);> >FileInputStream fis=>new> FileInputStream(>'abc.ser'>);> >ObjectInputStream ois=>new> ObjectInputStream(fis);> >Dog d2=(Dog) ois.readObject();> >System.out.println(>'Deserialization ended'>);> >System.out.println(>'Dog object data'>);> >//final result> >System.out.println(d2.i+>' '> +d2.j);> >}> }>

>

>

Výkon

serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>