logo

Serialisatie en deserialisatie in Java met voorbeeld

Serialisatie is een mechanisme om de status van een object om te zetten in een bytestroom. Deserialisatie is het omgekeerde proces waarbij de bytestroom wordt gebruikt om het daadwerkelijke Java-object in het geheugen opnieuw te creëren. Dit mechanisme wordt gebruikt om het object te behouden. serialize-deserialize-java
De gecreëerde bytestream is platformonafhankelijk. Het object dat op het ene platform is geserialiseerd, kan dus op een ander platform worden gedeserialiseerd. Om een ​​Java-object serialiseerbaar te maken, implementeren we de java.io.Serializeerbaar koppel. De klasse ObjectOutputStream bevat schrijfObject() methode voor het serialiseren van een object.

public final void writeObject(Object obj)  throws IOException>

De klasse ObjectInputStream bevat leesObject() methode voor het deserialiseren van een object.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Voordelen van serialisatie



  1. Om de status van een object op te slaan/te behouden.
  2. Om een ​​object over een netwerk te verplaatsen.

Alleen de objecten van de klassen die worden geïmplementeerd, kunnen worden geserialiseerd java.io.Serializeerbaar koppel. Serialiseerbaar is een marker-interface (heeft geen gegevenslid en methode). Het wordt gebruikt om Java-klassen te markeren, zodat objecten van deze klassen bepaalde mogelijkheden kunnen krijgen. Andere voorbeelden van markerinterfaces zijn: - Kloonbaar en op afstand.

Punten om te onthouden

1. Als een bovenliggende klasse een serialiseerbare interface heeft geïmplementeerd, hoeft de onderliggende klasse deze niet te implementeren, maar omgekeerd is dit niet waar.
2. Alleen niet-statische gegevensleden worden opgeslagen via het serialisatieproces.
3. Statische gegevensleden en tijdelijke gegevensleden worden niet opgeslagen via het serialisatieproces. Dus als u de waarde van een niet-statisch gegevenslid niet wilt opslaan, maak het dan tijdelijk.
4. De constructor van een object wordt nooit aangeroepen wanneer een object wordt gedeserialiseerd.
5. Bijbehorende objecten moeten een serialiseerbare interface implementeren. Voorbeeld :

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

Seriële versieUID De Serialization-runtime koppelt een versienummer aan elke Serializable-klasse, SerialVersionUID genaamd, die tijdens deserialisatie wordt gebruikt om te verifiëren dat de afzender en ontvanger van een geserialiseerd object klassen voor dat object hebben geladen die compatibel zijn met betrekking tot serialisatie. Als de ontvanger een klasse voor het object heeft geladen die een andere UID heeft dan die van de corresponderende klasse van de afzender, zal de deserialisatie resulteren in een OngeldigeKlasseException .

Een Serializable-klasse kan zijn eigen UID expliciet declareren door een veldnaam te declareren. Het moet statisch, definitief en van het type lang zijn. d.w.z. ANY-ACCESS-MODIFIER statische laatste lange serialVersionUID=42L; Als een serialiseerbare klasse niet expliciet een serialVersionUID declareert, berekent de serialisatieruntime een standaardwaarde voor die klasse op basis van verschillende aspecten van de klasse, zoals beschreven in Java Object Serialization Specification. Het wordt echter ten zeerste aanbevolen dat alle serialiseerbare klassen expliciet de serialVersionUID-waarde declareren, aangezien de berekening ervan zeer gevoelig is voor klassedetails die kunnen variëren afhankelijk van de compilerimplementaties. Elke wijziging in de klasse of het gebruik van een andere ID kan van invloed zijn op de geserialiseerde gegevens. Het wordt ook aanbevolen om een ​​privé-modifier voor UID te gebruiken, omdat deze niet nuttig is als overgeërfd lid. serieel De serialver is een tool die bij JDK wordt geleverd. Het wordt gebruikt om het serialVersionUID-nummer voor Java-klassen op te halen.

U kunt de volgende opdracht uitvoeren om serialVersionUID serialver [-classpath classpath] [-show] [classname…] op te halen Voorbeeld 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');> >}> >}> }>

>

shloka mehta

>

Uitgang:

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

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

>

>

string.waardevan java

Uitgang:

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>

Beschrijving voor uitvoer: U hebt gezien dat tijdens het deserialiseren van het object de waarden van a en b zijn veranderd. De reden daarvoor was dat a als tijdelijk werd gemarkeerd en b statisch.

In het geval van voorbijgaande variabelen: - Een variabele die is gedefinieerd met een tijdelijk trefwoord, wordt niet geserialiseerd tijdens het serialisatieproces. Deze variabele wordt tijdens de deserialisatie geïnitialiseerd met de standaardwaarde. (bijvoorbeeld: voor objecten is het nul, voor int is het 0).

In het geval van statische variabelen: - Een variabele die met een statisch trefwoord is gedefinieerd, wordt tijdens het serialisatieproces niet geserialiseerd. Deze variabele wordt tijdens deserialisatie geladen met de huidige waarde die in de klasse is gedefinieerd.

Voorbijgaand versus definitief:
laatste variabelen zullen rechtstreeks aan de serialisatie worden deelgenomen op basis van hun waarden.
Het heeft dus geen zin om een ​​laatste variabele als voorbijgaand te declareren.
//de compiler wijst de waarde toe aan de uiteindelijke variabele

voorbeeld:

final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10 omdat x definitief is. System.out.println(y);//20>

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

>

karakter.vergelijk Java
>

Uitvoer

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