logo

Serializācija un deserializācija Java ar piemēru

Serializācija ir mehānisms, kas objekta stāvokli pārvērš baitu plūsmā. Deserializācija ir apgriezts process, kurā baitu straume tiek izmantota, lai atmiņā atjaunotu faktisko Java objektu. Šis mehānisms tiek izmantots objekta saglabāšanai. serialize-deserialize-java
Izveidotā baitu straume ir neatkarīga no platformas. Tātad objektu, kas serializēts vienā platformā, var deserializēt citā platformā. Lai Java objektu padarītu serializējamu, mēs ieviešam java.io.Serializējams saskarne. ObjectOutputStream klase satur writeObject() Metode objekta serializēšanai.

public final void writeObject(Object obj)  throws IOException>

ObjectInputStream klase satur lasīt objektu () objekta deserializācijas metode.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Serializācijas priekšrocības



  1. Lai saglabātu/saglabātu objekta stāvokli.
  2. Lai pārvietotu objektu tīklā.

Serializēt var tikai to klašu objektus, kuras tiek realizētas java.io.Serializējams saskarne. Serializējams ir a marķiera interfeiss (nav datu dalībnieka un metodes). To izmanto, lai atzīmētu java klases, lai šo klašu objekti varētu iegūt noteiktas iespējas. Citi marķieru saskarņu piemēri ir: - klonējams un attālināts.

Punkti, kas jāatceras

1. Ja vecākklasē ir ieviests serializējams interfeiss, tad pakārtotajai klasei tas nav jāievieš, bet otrādi nav taisnība.
2. Serializācijas procesā tiek saglabāti tikai nestatiskie datu dalībnieki.
3. Serializācijas procesā netiek saglabāti statiskie datu elementi un īslaicīgie datu elementi. Tātad, ja nevēlaties saglabāt nestatisku datu elementa vērtību, padariet to par pārejošu.
4. Objekta konstruktors nekad netiek izsaukts, kad objekts tiek deserializēts.
5. Saistītajiem objektiem ir jāievieš serializējams interfeiss. Piemērs :

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

SerialVersionUID Serializācijas izpildlaiks saista versijas numuru ar katru serializējamo klasi, ko sauc par SerialVersionUID, kas tiek izmantots deserializācijas laikā, lai pārbaudītu, vai serializēta objekta sūtītājs un saņēmējs ir ielādējuši šim objektam klases, kas ir saderīgas ar serializāciju. Ja saņēmējs objektam ir ielādējis klasi, kuras UID atšķiras no atbilstošā sūtītāja klases UID, deserializācijas rezultātā tiks InvalidClassException .

Serializējamā klase var skaidri deklarēt savu UID, deklarējot lauka nosaukumu. Tam jābūt statiskam, galīgam un garam. i., JEBKURA PIEKĻUVES MODIFIER statiskā galīgā garā seriālāVersionUID=42L; Ja serializējamā klase skaidri nedeklarē serialVersionUID, serializācijas izpildlaiks aprēķinās šai klasei noklusējuma vērtību, pamatojoties uz dažādiem klases aspektiem, kā aprakstīts Java objektu serializācijas specifikācijā. Tomēr ir ļoti ieteicams, lai visas serializējamās klases skaidri deklarētu serialVersionUID vērtību, jo tās aprēķins ir ļoti jutīgs pret klases detaļām, kas var atšķirties atkarībā no kompilatora ieviešanas, jebkuras klases izmaiņas vai cita id izmantošana var ietekmēt serializētos datus. Ir arī ieteicams izmantot privāto modifikatoru UID, jo tas nav noderīgs kā iedzimts dalībnieks. seriāls Serialver ir rīks, kas tiek piegādāts kopā ar JDK. To izmanto, lai iegūtu serialVersionUID numuru Java klasēm.

Varat palaist šo komandu, lai iegūtu serialVersionUID serialver [-classpath classpath] [-show] [classname…] 1. piemērs:

0,0625 kā daļu

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

faktoriālā java

>

>

Izvade:

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

2. piemērs:

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

>

>

Izvade:

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>

Izvades apraksts: jūs redzējāt, ka objekta deserializēšanas laikā ir mainījušās a un b vērtības. Iemesls a tika atzīmēts kā pārejošs un b bija statisks.

Gadījumā, ja pārejoši mainīgie: - Mainīgais, kas definēts ar īslaicīgu atslēgvārdu, netiek serializēts serializācijas procesa laikā. Šis mainīgais tiks inicializēts ar noklusējuma vērtību deserializācijas laikā. (piemēram, objektiem tas ir nulle, int tas ir 0).

Gadījumā, ja statiskie mainīgie: - Mainīgais, kas definēts ar statisku atslēgvārdu, netiek serializēts serializācijas procesā. Šis mainīgais tiks ielādēts ar pašreizējo vērtību, kas definēta klasē deserializācijas laikā.

Pārejošs pret finālu:
galīgais mainīgie tiks iesaistīti serializācijā tieši pēc to vērtībām.
Līdz ar to galīgā mainīgā pasludināšana par pārejošu nav jēgas.
//kompilators piešķir vērtību gala mainīgajam

piemērs:

if-else java
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, jo x ir galīgs. System.out.println(y);//20>> 

3. piemērs:

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

jtextfield

>

Izvade

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