Serialisering er en mekanisme for å konvertere tilstanden til et objekt til en bytestrøm. Deserialisering er den omvendte prosessen der bytestrømmen brukes til å gjenskape det faktiske Java-objektet i minnet. Denne mekanismen brukes til å vedvare objektet.
Bytestrømmen som opprettes er plattformuavhengig. Så objektet som er serialisert på en plattform kan deserialiseres på en annen plattform. For å gjøre et Java-objekt serialiserbart implementerer vi java.io.Serialiserbar grensesnitt. ObjectOutputStream-klassen inneholder skriveobjekt() metode for å serialisere et objekt.
public final void writeObject(Object obj) throws IOException>
ObjectInputStream-klassen inneholder readObject() metode for å deserialisere et objekt.
public final Object readObject() throws IOException, ClassNotFoundException>
Fordeler med serialisering
- For å lagre/vedvare tilstanden til et objekt.
- Å reise et objekt over et nettverk.
Bare objektene til de klassene kan serialiseres som implementeres java.io.Serialiserbar grensesnitt. Serialiserbar er en markørgrensesnitt (har ingen datamedlem og metode). Den brukes til å merke java-klasser slik at objekter av disse klassene kan få visse muligheter. Andre eksempler på markørgrensesnitt er: - Klonbar og Remote.
Poeng å huske
1. Hvis en overordnet klasse har implementert Serializable-grensesnitt, trenger ikke barneklassen å implementere det, men omvendt er ikke sant.
2. Bare ikke-statiske datamedlemmer lagres via serialiseringsprosessen.
3. Statiske datamedlemmer og forbigående datamedlemmer lagres ikke via serialiseringsprosessen. Så hvis du ikke vil lagre verdien av et ikke-statisk datamedlem, så gjør det forbigående.
4. Konstruktør av objekt kalles aldri når et objekt er deserialisert.
5. Tilknyttede objekter må implementere serialiserbart grensesnitt. Eksempel:
class A implements Serializable{ // B also implements Serializable // interface. B ob=new B(); }>
SerialVersionUID Serialiseringskjøretiden knytter et versjonsnummer til hver Serializable-klasse kalt en SerialVersionUID, som brukes under deserialisering for å bekrefte at avsender og mottaker av et serialisert objekt har lastet klasser for det objektet som er kompatible med hensyn til serialisering. Hvis mottakeren har lastet inn en klasse for objektet som har en annen UID enn den tilsvarende senderens klasse, vil deserialiseringen resultere i en InvalidClassException .
En serialiserbar klasse kan deklarere sin egen UID eksplisitt ved å deklarere et feltnavn. Den må være statisk, endelig og av typen lang. dvs. ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Hvis en serialiserbar klasse ikke eksplisitt erklærer en serialVersionUID, vil serialiseringskjøretiden beregne en standard for den klassen basert på ulike aspekter ved klassen, som beskrevet i Java Object Serialization Specification. Det anbefales imidlertid på det sterkeste at alle serialiserbare klasser eksplisitt deklarerer serialVersionUID-verdien, siden beregningen er svært sensitiv for klassedetaljer som kan variere avhengig av kompilatorimplementeringer, enhver endring i klasse eller bruk av annen id kan påvirke de serialiserte dataene. Det anbefales også å bruke privat modifikator for UID siden det ikke er nyttig som arvet medlem. seriever Serialveren er et verktøy som følger med JDK. Den brukes til å få serialVersionUID-nummer for Java-klasser.
Du kan kjøre følgende kommando for å få serialVersionUID serialver [-classpath classpath] [-show] [classname...] Eksempel 1:
Java
java hashmap
// 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');> > }> > }> }> |
>
>
Utgang:
Object has been serialized Object has been deserialized a = 1 b = geeksforgeeks>
Eksempel 2:
Java
java skanner
// 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');> > }> > }> }> |
>
>
Produksjon:
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>
Beskrivelse for utdata: Du har sett under deserialisering av objektet at verdiene til a og b har endret seg. Årsaken til at a ble merket som forbigående og b var statisk.
I tilfelle forbigående variabler:- En variabel definert med forbigående nøkkelord blir ikke serialisert under serialiseringsprosessen. Denne variabelen vil bli initialisert med standardverdi under deserialisering. (f.eks: for objekter er det null, for int er det 0).
I tilfelle statiske variabler:- En variabel definert med statisk nøkkelord blir ikke serialisert under serialiseringsprosessen. Denne variabelen vil bli lastet med gjeldende verdi definert i klassen under deserialisering.
Transient vs Final:
endelig variabler vil bli deltatt i serialisering direkte av verdiene deres.
Derfor er det ingen bruk å erklære en endelig variabel som forbigående.
//kompilatoren tilordner verdien til den endelige variabelen
eksempel:
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10 fordi x er endelig. System.out.println(y);//20>
Eksempel 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);> > }> }> |
>
>Produksjon
serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>