La serialització és un mecanisme per convertir l'estat d'un objecte en un flux de bytes. La deserialització és el procés invers on el flux de bytes s'utilitza per recrear l'objecte Java real a la memòria. Aquest mecanisme s'utilitza per mantenir l'objecte.
El flux de bytes creat és independent de la plataforma. Per tant, l'objecte serialitzat en una plataforma es pot deserialitzar en una plataforma diferent. Per fer que un objecte Java sigui serialitzable, implementem el java.io.Serialitzable interfície. La classe ObjectOutputStream conté writeObject() mètode per serialitzar un objecte.
public final void writeObject(Object obj) throws IOException>
La classe ObjectInputStream conté readObject() mètode per deserialitzar un objecte.
public final Object readObject() throws IOException, ClassNotFoundException>
Avantatges de la serialització
- Per guardar/persistir l'estat d'un objecte.
- Viatjar un objecte per una xarxa.

Només es poden serialitzar els objectes d'aquestes classes que s'estan implementant java.io.Serialitzable interfície. Serialitzable és a interfície del marcador (no té cap membre de dades ni mètode). S'utilitza per marcar classes java de manera que els objectes d'aquestes classes puguin tenir certa capacitat. Altres exemples d'interfícies de marcadors són: - Clonable i Remot.
mysql mostra tots els usuaris
Punts a recordar
1. Si una classe pare ha implementat la interfície Serializable, la classe fill no necessita implementar-la, però a l'inrevés no és cert.
2. Només es guarden els membres de dades no estàtiques mitjançant el procés de serialització.
3. Els membres de dades estàtiques i els membres de dades transitoris no es guarden mitjançant el procés de serialització. Per tant, si no voleu desar el valor d'un membre de dades no estàtiques, feu que sigui transitori.
4. El constructor d'un objecte no s'anomena mai quan un objecte es deserialitza.
5. Els objectes associats han d'estar implementant una interfície serialitzable. Exemple:
class A implements Serializable{ // B also implements Serializable // interface. B ob=new B(); }> SerialVersionUID El temps d'execució de la serialització associa un número de versió amb cada classe Serializable anomenat SerialVersionUID, que s'utilitza durant la deserialització per verificar que l'emissor i el receptor d'un objecte serialitzat han carregat classes per a aquest objecte que són compatibles amb la serialització. Si el receptor ha carregat una classe per a l'objecte que té un UID diferent al de la classe del remitent corresponent, la deserialització donarà lloc a un InvalidClassException .
Una classe serialitzable pot declarar explícitament el seu propi UID declarant un nom de camp. Ha de ser estàtic, final i de tipus llarg. és a dir, QUALSEVOL MODIFICATOR D'ACCÉS estàtic final llarg serialVersionUID=42L; Si una classe serialitzable no declara explícitament un serialVersionUID, el temps d'execució de la serialització en calcularà un per defecte per a aquesta classe en funció de diversos aspectes de la classe, tal com es descriu a l'Especificació de serialització d'objectes Java. No obstant això, és molt recomanable que totes les classes serialitzables declarin explícitament el valor serialVersionUID, ja que el seu càlcul és molt sensible als detalls de classe que poden variar segons les implementacions del compilador, qualsevol canvi de classe o l'ús d'un identificador diferent pot afectar les dades serialitzades. També es recomana utilitzar el modificador privat per a l'UID, ja que no és útil com a membre heretat. serialver El serialver és una eina que ve amb JDK. S'utilitza per obtenir el número serialVersionUID per a les classes Java.
Podeu executar l'ordre següent per obtenir serialVersionUID serialver [-classpath classpath] [-show] [classname...]
Exemple 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');> >}> >}> }> |
gzip per a Linux
>
>
Sortida:
Object has been serialized Object has been deserialized a = 1 b = geeksforgeeks>
Exemple 2:
Java
constructor en 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');> >}> >}> }> |
>
>
Sortida:
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>
Descripció de la sortida: heu vist que durant la deserialització de l'objecte els valors de a i b han canviat. La raó de ser a es va marcar com a transitòria i b era estàtica.
En cas de variables transitòries: - Una variable definida amb la paraula clau transitòria no es serialitza durant el procés de serialització. Aquesta variable s'inicializarà amb el valor predeterminat durant la deserialització. (p. ex.: per als objectes és nul, per a int és 0).
En cas de Variables estàtiques: - Una variable definida amb la paraula clau estàtica no es serialitza durant el procés de serialització. Aquesta variable es carregarà amb el valor actual definit a la classe durant la deserialització.
Transitori vs final:
final les variables es participaran en la serialització directament pels seus valors.
Per tant, declarar una variable final com a transitòria no serveix de res.
//el compilador assigna el valor a la variable final
exemple:
desinstal·leu angular cli
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10 perquè x és final. System.out.println(y);//20>>>Exemple 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);> >}> }> |
25 de 100
>Sortida
serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>