Serialización y deserialización en Java con ejemplo

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 persistir el objeto.

serialize-deserialize-java

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 la interfaz java.io.Serializable .
La clase ObjectOutputStream contiene el método writeObject() para serializar un objeto.

public final void writeObject(Object obj)
                       throws IOException

La clase ObjectInputStream contiene el método readObject() para deserializar un objeto.

public final Object readObject()
                  throws IOException,
               ClassNotFoundException

Ventajas de la Serialización
1. Para guardar/mantener el estado de un objeto.
2. Para viajar un objeto a través de una red.

Solo se pueden serializar los objetos de esas clases que implementan la interfaz java.io.Serializable .
Serializable es una interfaz de marcador (no tiene miembro de datos ni método). Se utiliza para «marcar» las clases de Java para que los objetos de estas clases puedan obtener cierta capacidad. Otros ejemplos de interfaces de marcador son:- Clonable y Remoto.

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. Solo los miembros de datos no estáticos se guardan a través del proceso de serialización.
3. Los miembros de datos estáticos y los miembros de datos transitorios no se guardan a través del 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 denominada 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 son 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 una InvalidClassException . Una clase Serializable puede declarar su propio UID explícitamente declarando un nombre de campo.
Debe ser estático, definitivo y de tipo largo.
es decir, ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;

Si una clase serializable no declara explícitamente un serialVersionUID, 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 usar el modificador privado para UID ya que no es útil como miembro heredado.

serialver
El serialver es una herramienta que viene con JDK. Se utiliza para obtener el número serialVersionUID para las clases de Java.
Puede ejecutar el siguiente comando para obtener serialVersionUID

serialver [-classpath classpath] [-show] [nombre de clase…]

Ejemplo 1:

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

Producción :

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

Ejemplo 2:

// 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\n"
                              + "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\n"
                                + "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 para la salida:
ha visto que al deserializar el objeto, los valores de a y b han cambiado. El motivo es que a se marcó como transitorio y b como estático.
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 la 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.

Este artículo es una contribución de Mehak Narang y Shubham Juneja . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

 
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *