Serialización en Java

La serialización en Java es un mecanismo que convierte el estado de un objeto en una secuencia de bytes. La deserialización es su proceso inverso. A través de la deserialización, a partir de una secuencia de bytes, se crea un objeto Java real en la memoria. Tal mecanismo persiste el objeto.

La secuencia de bytes creada a partir de la serialización no depende de ninguna plataforma. El objeto serializado en una plataforma se puede deserializar en cualquier otra plataforma sin ningún problema. Por lo tanto, todo el proceso de serialización y deserialización es independiente de JVM.

Si un objeto de clase se va a serializar, entonces uno necesita implementar la interfaz java.io.Serializable. Serializable en java es una interfaz de marcador. No tiene campos ni métodos para implementar. Este proceso hace que una clase sea serializable, que se parece a un proceso de aceptación.

La serialización en Java es implementada por las dos clases ObjectInputStream y ObjectOutputStream.

Todo lo que se requiere es una envoltura sobre ellos para que pueda guardarse en un archivo o enviarse a través de una red.

El concepto de serialización en Java

La clase ObjectOutputStream, que es la clase de serialización como se menciona en la sección anterior, contiene varios métodos de escritura para escribir varios tipos de datos, pero uno de los métodos es el más popular.

public final void writeObject(Object x) throws IOException

El método anterior se puede utilizar para serializar un objeto. Este método también lo envía a la secuencia de salida. Del mismo modo, la clase ObjectInputStream contiene el método para la deserialización de objetos

public final Object readObject() throws IOException, ClassNotFoundException

El método de deserialización recupera el objeto de una secuencia y lo deserializa. El valor de retorno es nuevamente un objeto, por lo que todo lo que se necesita es convertirlo en un tipo de datos relevante.

Para que una clase se serialice correctamente, hay dos condiciones que se deben cumplir:

  • io. La interfaz serializable debe ser implementada por la clase.
  • Todos los campos de la clase deben ser serializables. Si incluso un campo no es serializable, entonces debe marcarse como transitorio.

Si alguien necesita verificar si una clase es serializable o no, la solución simple es verificar si la clase implementa el método java.io.Serializable, si lo hace, entonces es serializable si no lo es, entonces no lo es.

Uno debe notar que cuando se serializa un objeto a un archivo, la práctica estándar es darle al archivo una extensión .ser.

Método de serialización en Java

Si estos métodos están presentes en la clase, se utilizan para la serialización con fines Java.

Método Descripción
public final void writeObject (Object obj) lanza IOException ()Esto escribirá el objeto especificado en ObjectOutputStream.
public void flush () arroja IOException ()Esto vaciará el flujo de salida actual.
public void close () arroja IOException ()Esto cerrará la corriente de salida actual.

Método de deserialización en Java

Método Descripción
public final Object readObject () arroja IOException, ClassNotFoundException ()Esto leerá un objeto del flujo de entrada.
public void close () arroja IOException ()Esto cerrará ObjectInputStream.

Ejemplos de serialización en Java

En esta sección, hemos discutido la serialización en Java con ejemplos.

Aquí se proporciona un ejemplo en Java para demostrar cómo funciona la serialización en Java. Creamos una clase de Empleado para estudiar algunas características y el código para las mismas se proporciona a continuación. Esta clase de empleado implementa la interfaz serializable.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Cuando este programa se termine de ejecutar, se creará un archivo llamado employee.ser. Este programa no proporciona una salida garantizada, más bien es solo para fines explicativos y el objetivo es comprender su uso y funcionamiento.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

El programa DeserializeDemo descrito a continuación deserializa el objeto Empleado anterior creado en el programa Serialize Demo .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

El código anterior producirá el siguiente resultado:

Salida

Empleado deserializado …

Nombre: Rahul Jain

Dirección: Epip, Bangalore.

SSN: 0

Número: 131

Algunos puntos importantes relacionados con el programa anterior se proporcionan a continuación:

  • El bloque try / catch anterior intenta capturar una ClassNotFoundException. Esto se declara mediante el método readObject ().
  • Una JVM puede deserializar un objeto, solo si encuentra el código de bytes para la clase.
  • Si la JVM no encuentra una clase durante la deserialización, arrojará ClassNotFoundException.
  • El valor de retorno de readObject () siempre se convierte en una referencia de empleado.
  • El valor del campo SSN fue 114433 inicialmente cuando el objeto se serializó, pero como este valor no se envió a la secuencia de salida. Por lo mismo, el objeto de campo SSN del empleado deserializado es 0.

Conclusión

Arriba, presentamos conceptos de serialización y proporcionamos ejemplos. Entendamos la necesidad de serialización como nuestras observaciones finales.

  • Comunicación: si dos máquinas que ejecutan el mismo código necesitan comunicarse, la forma más fácil es que una máquina construya un objeto que contenga información que transmitiría y luego serialice ese objeto antes de enviarlo a la otra máquina. No es un gran método, pero hace el trabajo.
  • Persistencia: si el estado de la operación se va a almacenar en una base de datos, primero se serializa en una matriz de bytes y luego se almacena en la base de datos para su recuperación en un momento posterior.
  • Copia profunda: si es necesario crear una réplica exacta de un Objeto y escribir una clase de clonación especializada es demasiado trabajo, entonces solo serializando el objeto y luego des-serializándolo a otro objeto logrará el objetivo.
  • Sincronización cruzada de JVM: se pueden sincronizar diferentes JVM que se ejecutan en diferentes máquinas y arquitecturas.

Artículos recomendados

Esta ha sido una guía para la serialización en Java. Aquí hemos discutido los diferentes métodos de serialización en Java con ejemplos. También puede consultar el siguiente artículo para obtener más información:

  1. Preguntas de la entrevista para desarrolladores de Java
  2. Lista Java vs Lista de matrices
  3. Usos de JavaScript