logo

Serialisering och deserialisering i Java med exempel

Serialisering är en mekanism för att omvandla ett objekts tillstånd till en byteström. Deserialisering är den omvända processen där byteströmmen används för att återskapa det faktiska Java-objektet i minnet. Denna mekanism används för att bevara objektet. serialisera-deserialisera-java
Byteströmmen som skapas är plattformsoberoende. Så objektet serialiserat på en plattform kan deserialiseras på en annan plattform. För att göra ett Java-objekt serialiserbart implementerar vi java.io.Serialiserbar gränssnitt. Klassen ObjectOutputStream innehåller writeObject() metod för att serialisera ett objekt.

public final void writeObject(Object obj)  throws IOException>

Klassen ObjectInputStream innehåller readObject() metod för att deserialisera ett objekt.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Fördelar med serialisering



objekt för java
  1. Att spara/bevara ett objekts tillstånd.
  2. Att resa ett föremål över ett nätverk.

Endast objekten i dessa klasser kan serialiseras som implementeras java.io.Serialiserbar gränssnitt. Serialiserbar är en markörgränssnitt (har ingen datamedlem och metod). Det används för att markera java-klasser så att objekt av dessa klasser kan få viss förmåga. Andra exempel på markörgränssnitt är: - Klonbar och Remote.

Punkter att komma ihåg

1. Om en förälderklass har implementerat Serializable-gränssnitt behöver inte barnklass implementera det men vice versa är inte sant.
2. Endast icke-statiska datamedlemmar sparas via serialiseringsprocessen.
3. Statiska datamedlemmar och transienta datamedlemmar sparas inte via serialiseringsprocessen. Så om du inte vill spara värdet på en icke-statisk datamedlem, gör det övergående.
4. Konstruktör av objekt anropas aldrig när ett objekt deserialiseras.
5. Associerade objekt måste implementera Serialiserbart gränssnitt. Exempel:

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

SerialVersionUID Serialiseringskörningstiden associerar ett versionsnummer med varje serialiserad klass som kallas SerialVersionUID, som används under Deserialization för att verifiera att avsändaren och mottagaren av ett serialiserat objekt har laddade klasser för det objektet som är kompatibla med avseende på serialisering. Om mottagaren har laddat en klass för objektet som har ett annat UID än motsvarande avsändarklass, kommer deserialiseringen att resultera i en InvalidClassException .

En serialiserbar klass kan explicit deklarera sitt eget UID genom att deklarera ett fältnamn. Den måste vara statisk, slutgiltig och av typen lång. d.v.s. ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Om en serialiserbar klass inte uttryckligen deklarerar ett serialVersionUID, kommer serialiseringskörningstiden att beräkna en standard för den klassen baserat på olika aspekter av klassen, som beskrivs i Java Object Serialization Specification. Det rekommenderas dock starkt att alla serialiserbara klasser uttryckligen deklarerar serialVersionUID-värdet, eftersom dess beräkning är mycket känslig för klassdetaljer som kan variera beroende på kompilatorimplementeringar, varje förändring i klass eller användning av annat ID kan påverka den serialiserade datan. Det rekommenderas också att använda privat modifierare för UID eftersom det inte är användbart som ärvd medlem. seriellver Serialver är ett verktyg som kommer med JDK. Det används för att få serialVersionUID-nummer för Java-klasser.

Du kan köra följande kommando för att få serialVersionUID serialver [-classpath classpath] [-show] [classname...] Exempel 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');> >}> >}> }>

>

konvertera char till sträng java

>

Utgång:

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

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

>

>

byta java-programmering

Produktion:

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>

Beskrivning för utdata: Du har sett att värdena för a och b har ändrats när objektet deserialiserades. Anledningen till att a markerades som transient och b var statisk.

I fall att transienta variabler:- En variabel definierad med transient nyckelord serialiseras inte under serialiseringsprocessen. Den här variabeln initieras med standardvärde under deserialisering. (t.ex.: för objekt är det noll, för int är det 0).

I fall att statiska variabler:- En variabel definierad med statiskt nyckelord serialiseras inte under serialiseringsprocessen. Den här variabeln kommer att laddas med aktuellt värde som definieras i klassen under deserialisering.

Transient kontra final:
slutlig variabler kommer att delta i serialiseringen direkt av deras värden.
Därför är det ingen användning att förklara en slutlig variabel som transient.
//kompilatorn tilldelar värdet till den slutliga variabeln

exempel:

final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10 eftersom x är slutgiltigt. System.out.println(y);//20>

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

>

Java anonym funktion
>

Produktion

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