logo

Serializavimas ir deserializavimas Java su pavyzdžiu

Serializavimas yra mechanizmas, paverčiantis objekto būseną į baitų srautą. Deserializavimas yra atvirkštinis procesas, kai baitų srautas naudojamas atkurti tikrąjį Java objektą atmintyje. Šis mechanizmas naudojamas objektui išlaikyti. serializuoti-deserializuoti-java
Sukurtas baitų srautas nepriklauso nuo platformos. Taigi, objektas, serializuotas vienoje platformoje, gali būti serializuotas kitoje platformoje. Kad Java objektas būtų serializuojamas, įgyvendiname java.io.Serializuojama sąsaja. „ObjectOutputStream“ klasėje yra writeObject() Objekto serializavimo metodas.

public final void writeObject(Object obj)  throws IOException>

„ObjectInputStream“ klasėje yra readObject() objekto deserializavimo metodas.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Serializavimo privalumai



  1. Norėdami išsaugoti / išlaikyti objekto būseną.
  2. Norėdami perkelti objektą tinkle.

Serializuoti galima tik tų klasių objektus, kurios yra įgyvendinamos java.io.Serializuojama sąsaja. Serializuoti yra a žymeklio sąsaja (neturi duomenų nario ir metodo). Jis naudojamas java klasėms žymėti, kad šių klasių objektai galėtų įgyti tam tikras galimybes. Kiti žymeklio sąsajų pavyzdžiai: - Klonuojamas ir nuotolinis.

Taškai, kuriuos reikia prisiminti

1. Jei pagrindinė klasė įdiegė nuosekliąją sąsają, antrinei klasei jos diegti nereikia, bet atvirkščiai.
2. Serializacijos metu išsaugomi tik nestatiniai duomenų nariai.
3. Statiniai duomenų nariai ir trumpalaikiai duomenų nariai neišsaugomi serializacijos procese. Taigi, jei nenorite išsaugoti nestatinio duomenų nario vertės, padarykite jį trumpalaikį.
4. Objekto konstruktorius niekada neiškviečiamas, kai objektas yra deserializuojamas.
5. Susieti objektai turi turėti nuosekliąją sąsają. Pavyzdys :

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

SerialVersionUID Serializavimo vykdymo laikas susieja versijos numerį su kiekviena serializuojama klase, vadinama SerialVersionUID, kuri naudojama atliekant serializavimą, siekiant patikrinti, ar serijinio objekto siuntėjas ir gavėjas įkėlė to objekto klases, kurios yra suderinamos su serializavimu. Jei gavėjas įkėlė objekto klasę, kurios UID skiriasi nuo atitinkamos siuntėjo klasės, deserializacijos rezultatas InvalidClassException .

Serializuojama klasė gali aiškiai deklaruoti savo UID, deklaruodama lauko pavadinimą. Jis turi būti statinis, galutinis ir ilgo tipo. t.y. BET KOKIO PRIEIGOS MODIFITORIAUS statinis galutinis ilgas serialVersionUID=42L; Jei serializuojama klasė aiškiai nenurodo serialVersionUID, serializacijos vykdymo laikas apskaičiuos tos klasės numatytąjį, remdamasis įvairiais klasės aspektais, kaip aprašyta „Java“ objektų serializacijos specifikacijoje. Tačiau primygtinai rekomenduojama, kad visose serializuojamose klasėse būtų aiškiai nurodyta serialVersionUID reikšmė, nes jos apskaičiavimas yra labai jautrus išsamiai klasės informacijai, kuri gali skirtis priklausomai nuo kompiliatoriaus diegimo, bet koks klasės pakeitimas arba kitokio ID naudojimas gali turėti įtakos serijiniams duomenims. Taip pat rekomenduojama naudoti privatų UID modifikatorių, nes jis nėra naudingas kaip paveldėtas narys. serialver Serialver yra įrankis, kuris pateikiamas kartu su JDK. Jis naudojamas norint gauti serialVersionUID numerį Java klasėms.

palyginamas sąrašas

Galite paleisti šią komandą, kad gautumėte serialVersionUID serialver [-classpath classpath] [-show] [classname…] 1 pavyzdys:

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

>

struktūros masyvas c kalba

>

Išvestis:

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

2 pavyzdys:

Java




Imessage žaidimai android

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

>

>

Išvestis:

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>

Išvesties aprašymas: deserializuodami objektą matėte, kad a ir b reikšmės pasikeitė. Priežastis a buvo pažymėta kaip trumpalaikė, o b buvo statinė.

Tuo atveju pereinamieji kintamieji: - Kintamasis, apibrėžtas trumpalaikiu raktiniu žodžiu, nėra serializuojamas serializacijos proceso metu. Šis kintamasis bus inicijuotas pagal numatytąją vertę deserializacijos metu. (pvz.: objektams jis yra nulis, int - 0).

Tuo atveju statiniai kintamieji: - Kintamasis, apibrėžtas statiniu raktiniu žodžiu, nėra serializuojamas serializacijos proceso metu. Šis kintamasis bus įkeltas su dabartine verte, apibrėžta klasėje deserializacijos metu.

Laikinasis prieš finalą:
galutinis kintamieji bus tiesiogiai įtraukti į serializavimą pagal jų reikšmes.
Taigi paskelbti galutinį kintamąjį kaip trumpalaikį nėra jokios naudos.
//kompiliatorius priskiria reikšmę galutiniam kintamajam

pavyzdys:

final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, nes x yra galutinis. System.out.println(y);//20>> 

3 pavyzdys:

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

java galiojantys identifikatoriai
>

Išvestis

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