logo

Serialisointi ja deserialisointi Javassa esimerkin avulla

Serialisointi on mekanismi, jolla kohteen tila muunnetaan tavuvirraksi. Deserialisointi on käänteinen prosessi, jossa tavuvirtaa käytetään todellisen Java-objektin uudelleenluomiseen muistissa. Tätä mekanismia käytetään objektin säilyttämiseen. serialize-deserialize-java
Luotu tavuvirta on alustariippumaton. Joten yhdellä alustalla sarjoitettu objekti voidaan deserialisoida eri alustalla. Jotta Java-objekti olisi serialoitava, toteutamme java.io.Serialoitavissa käyttöliittymä. ObjectOutputStream-luokka sisältää writeObject() menetelmä objektin sarjoittamiseksi.

public final void writeObject(Object obj)  throws IOException>

ObjectInputStream-luokka sisältää readObject() menetelmä objektin deserialisoimiseksi.



public final Object readObject()  throws IOException,  ClassNotFoundException>

Serialisoinnin edut

  1. Objektin tilan tallentaminen/säilyttäminen.
  2. Objektin kuljettaminen verkon yli.

Vain niiden luokkien objektit voidaan serialisoida, jotka toteutuvat java.io.Serialoitavissa käyttöliittymä. Sarjasoitava on a merkin käyttöliittymä (ei datajäsentä ja menetelmää). Sitä käytetään java-luokkien merkitsemiseen, jotta näiden luokkien objektit voivat saada tietyn kyvyn. Muita esimerkkejä merkkiliitännöistä ovat: - Kloonattava ja etäkäyttöinen.



char merkkijonoon java

Muistettavat kohdat

1. Jos yläluokka on toteuttanut Serialisoitavan käyttöliittymän, aliluokan ei tarvitse toteuttaa sitä, mutta päinvastoin ei pidä paikkaansa.
2. Vain ei-staattiset datajäsenet tallennetaan serialisointiprosessin kautta.
3. Staattisia datajäseniä ja ohimeneviä datajäseniä ei tallenneta serialisointiprosessin kautta. Joten jos et halua tallentaa ei-staattisen datajäsenen arvoa, tee siitä ohimenevä.
4. Objektin konstruktoria ei koskaan kutsuta, kun objekti deserialisoidaan.
5. Assosioitujen objektien tulee olla serialisoitavaa käyttöliittymää toteuttavia. Esimerkki:

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

SerialVersionUID Serialization ajonaika liittää versionumeron jokaiseen Serialisoitavaan luokkaan, jota kutsutaan SerialVersionUID:ksi, jota käytetään sarjoituksessa varmistamaan, että serialisoidun objektin lähettäjällä ja vastaanottajalla on kyseiselle objektille ladatut luokat, jotka ovat yhteensopivia serialisoinnin suhteen. Jos vastaanottaja on ladannut objektille luokan, jolla on eri UID kuin vastaavan lähettäjän luokassa, sarjanpoisto johtaa InvalidClassException .



Serialisoitava luokka voi ilmoittaa oman UID:nsä nimenomaisesti ilmoittamalla kentän nimen. Sen on oltava staattinen, lopullinen ja pitkä. eli JOKAINEN PÄÄSY-MUOKKAUS, staattinen lopullinen pitkä sarjaversioUID=42L; Jos serialoitava luokka ei nimenomaisesti ilmoita serialVersionUID-tunnusta, serialisoinnin suoritusaika laskee oletusarvon kyseiselle luokalle luokan eri näkökohtien perusteella, kuten on kuvattu Java-objektien serialisointimäärityksessä. On kuitenkin erittäin suositeltavaa, että kaikki serialoitavat luokat ilmoittavat nimenomaisesti serialVersionUID-arvon, koska sen laskenta on erittäin herkkä luokan yksityiskohdille, jotka voivat vaihdella kääntäjien toteutuksista riippuen. Muutokset luokassa tai erilaisen tunnuksen käyttö voivat vaikuttaa sarjoitettuihin tietoihin. On myös suositeltavaa käyttää yksityistä muokkaajaa UID:lle, koska se ei ole hyödyllinen perittynä jäsenenä. sarjaversio Serialver on työkalu, joka tulee JDK:n mukana. Sitä käytetään serialVersionUID-numeron saamiseksi Java-luokille.

Voit suorittaa seuraavan komennon saadaksesi serialVersionUID serialver [-classpath classpath] [-show] [classname…] Esimerkki 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');> >}> >}> }>

linux komennot jotka

>

>

Lähtö:

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

Esimerkki 2:

Java




tietorakenne

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

>

>

Lähtö:

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>

Tulosteen kuvaus: Olet nähnyt objektin sarjoittamisen aikana, että a:n ja b:n arvot ovat muuttuneet. Syynä a merkittiin ohimeneväksi ja b oli staattinen.

Siinä tapauksessa ohimenevät muuttujat: - Transient-avainsanalla määritettyä muuttujaa ei sarjoiteta serialisoinnin aikana. Tämä muuttuja alustetaan oletusarvolla deserialisoinnin aikana. (esim. kohteille se on nolla, int:lle se on 0).

Siinä tapauksessa staattiset muuttujat: - Staattisella avainsanalla määritettyä muuttujaa ei sarjoiteta sarjoituksessa. Tämä muuttuja ladataan luokassa määritetyllä nykyisellä arvolla sarjoituksessa.

Ohimenevä vs finaali:
lopullinen muuttujat osallistuvat sarjoitukseen suoraan arvojensa kautta.
Siksi lopullisen muuttujan julistamisesta transienttiksi ei ole hyötyä.
//kääntäjä antaa arvon lopulliselle muuttujalle

esimerkki:

sql järjestys päivämäärän mukaan
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, koska x on lopullinen. System.out.println(y);//20>> 

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

pythonin koko

>

Lähtö

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