La serialización es un mecanismo para convertir el estado de un objeto en un flujo de bytes. La deserialización es el proceso inverso en el que se utiliza el flujo de bytes para recrear el objeto Java real en la memoria. Este mecanismo se utiliza para conservar el objeto.
El flujo de bytes creado es independiente de la plataforma. Por lo tanto, el objeto serializado en una plataforma se puede deserializar en una plataforma diferente. Para hacer que un objeto Java sea serializable implementamos el java.io.Serializable interfaz. La clase ObjectOutputStream contiene escribirObjeto() Método para serializar un objeto.
public final void writeObject(Object obj) throws IOException>
La clase ObjectInputStream contiene leerObjeto() Método para deserializar un objeto.
public final Object readObject() throws IOException, ClassNotFoundException>
Ventajas de la serialización
- Para guardar/persistir el estado de un objeto.
- Para viajar un objeto a través de una red.

Sólo se pueden serializar los objetos de aquellas clases que están implementando java.io.Serializable interfaz. Serializable es un interfaz de marcador (no tiene miembro ni método de datos). Se utiliza para marcar clases de Java para que los objetos de estas clases puedan obtener cierta capacidad. Otros ejemplos de interfaces de marcador son: Clonables y Remota.
Puntos para recordar
1. Si una clase principal ha implementado una interfaz serializable, entonces la clase secundaria no necesita implementarla, pero viceversa no es cierto.
2. Sólo los miembros de datos no estáticos se guardan mediante el proceso de serialización.
3. Los miembros de datos estáticos y los miembros de datos transitorios no se guardan mediante el proceso de serialización. Por lo tanto, si no desea guardar el valor de un miembro de datos no estáticos, hágalo transitorio.
4. Nunca se llama al constructor del objeto cuando se deserializa un objeto.
5. Los objetos asociados deben implementar una interfaz serializable. Ejemplo :
class A implements Serializable{ // B also implements Serializable // interface. B ob=new B(); }> SerialVersionUID El tiempo de ejecución de serialización asocia un número de versión con cada clase serializable llamada SerialVersionUID, que se usa durante la deserialización para verificar que el remitente y el receptor de un objeto serializado hayan cargado clases para ese objeto que sean compatibles con respecto a la serialización. Si el receptor ha cargado una clase para el objeto que tiene un UID diferente al de la clase del remitente correspondiente, la deserialización dará como resultado un Excepción de clase no válida .
Una clase serializable puede declarar su propio UID explícitamente declarando un nombre de campo. Debe ser estático, final y de tipo largo. es decir, ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Si una clase serializable no declara explícitamente un serialVersionUID, entonces el tiempo de ejecución de serialización calculará uno predeterminado para esa clase en función de varios aspectos de la clase, como se describe en Especificación de serialización de objetos Java. Sin embargo, se recomienda encarecidamente que todas las clases serializables declaren explícitamente el valor serialVersionUID, ya que su cálculo es muy sensible a los detalles de la clase que pueden variar según las implementaciones del compilador, cualquier cambio en la clase o el uso de una identificación diferente puede afectar los datos serializados. También se recomienda utilizar un modificador privado para UID ya que no es útil como miembro heredado. serializador El serialver es una herramienta que viene con JDK. Se utiliza para obtener el número serialVersionUID para clases Java.
Puede ejecutar el siguiente comando para obtener serialVersionUID serialver [-classpath classpath] [-show] [classname…]
Ejemplo 1:
búsqueda binaria en java
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');> >}> >}> }> |
convertir cadena en int
>
>
Producción :
lenguaje java central
Object has been serialized Object has been deserialized a = 1 b = geeksforgeeks>
Ejemplo 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');> >}> >}> }> |
>
>
Producción:
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ón de la salida: Ha visto que al deserializar el objeto los valores de a y b han cambiado. La razón por la que a se marcó como transitoria y b era estática.
En caso de variables transitorias: - Una variable definida con la palabra clave transitoria no se serializa durante el proceso de serialización. Esta variable se inicializará con el valor predeterminado durante la deserialización. (por ejemplo: para objetos es nulo, para int es 0).
En caso de Variables estáticas: - Una variable definida con una palabra clave estática no se serializa durante el proceso de serialización. Esta variable se cargará con el valor actual definido en la clase durante la deserialización.
Transitorio versus final:
final Las variables participarán en la serialización directamente por sus valores.
Por lo tanto, declarar una variable final como transitoria no sirve de nada.
//el compilador asigna el valor a la variable final
ejemplo:
.siguiente java
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10 porque x es final. System.out.println(y);//20>
Ejemplo 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);> >}> }> |
dividir cadenas c++
>
>Producción
serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>