logo

Serialización y deserialización en Java

  1. Publicación por entregas
  2. Interfaz serializable
  3. Ejemplo de serialización
  4. Ejemplo de deserialización
  5. Serialización con herencia
  6. Interfaz externalizable
  7. Miembro de serialización y datos estáticos.

Serialización en Java es un mecanismo de escribir el estado de un objeto en un flujo de bytes . Se utiliza principalmente en tecnologías Hibernate, RMI, JPA, EJB y JMS.

La operación inversa de la serialización se llama deserialización donde el flujo de bytes se convierte en un objeto. El proceso de serialización y deserialización es independiente de la plataforma, lo que significa que puede serializar un objeto en una plataforma y deserializarlo en una plataforma diferente.

Para serializar el objeto, llamamos al escribirObjeto() método de flujo de salida de objetos clase, y para la deserialización llamamos a la leerObjeto() método de flujo de entrada de objetos clase.

Debemos tener que implementar el Serializable interfaz para serializar el objeto.

Ventajas de la serialización de Java

Se utiliza principalmente para viajar el estado del objeto en la red (lo que se conoce como marshalling).

serialización java

interfaz java.io.Serializable

Serializable es una interfaz de marcador (no tiene ningún miembro ni método de datos). Se utiliza para 'marcar' clases Java para que los objetos de estas clases puedan obtener una determinada capacidad. El Clonable y Remoto También son interfaces de marcador.

El Serializable La interfaz debe ser implementada por la clase cuyo objeto debe persistir.

La clase String y todas las clases contenedoras implementan el java.io.Serializable interfaz de forma predeterminada.

Veamos el ejemplo que se da a continuación:

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

En el ejemplo anterior, Alumno La clase implementa una interfaz serializable. Ahora sus objetos se pueden convertir en flujo. La implementación de la clase principal se muestra en el siguiente código.

sonrisa más hermosa

Clase ObjectOutputStream

La clase ObjectOutputStream se utiliza para escribir tipos de datos primitivos y objetos Java en un OutputStream. Sólo los objetos que admiten la interfaz java.io.Serializable se pueden escribir en secuencias.

Constructor

1) public ObjectOutputStream (OutputStream out) lanza IOException {}Crea un ObjectOutputStream que escribe en el OutputStream especificado.

Métodos importantes

MétodoDescripción
1) writeObject final público vacío (Objeto obj) lanza IOException {}Escribe el objeto especificado en ObjectOutputStream.
2) public void Flush() lanza IOException {}Vacía el flujo de salida actual.
3) public void close() lanza IOException {}Cierra el flujo de salida actual.

Clase ObjectInputStream

Un ObjectInputStream deserializa objetos y datos primitivos escritos utilizando un ObjectOutputStream.

Constructor

1) public ObjectInputStream (InputStream in) lanza IOException {}Crea un ObjectInputStream que lee del InputStream especificado.

Métodos importantes

MétodoDescripción
1) El objeto público final readObject() arroja IOException, ClassNotFoundException{}Lee un objeto del flujo de entrada.
2) public void close() lanza IOException {}Cierra ObjectInputStream.

Ejemplo de serialización de Java

En este ejemplo, vamos a serializar el objeto de Alumno clase del código anterior. El método writeObject() de la clase ObjectOutputStream proporciona la funcionalidad para serializar el objeto. Estamos guardando el estado del objeto en el archivo llamado f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Producción:

 success 
descarga este ejemplo de serialización

Ejemplo de deserialización de Java

La deserialización es el proceso de reconstruir el objeto desde el estado serializado. Es la operación inversa de la serialización. Veamos un ejemplo donde estamos leyendo los datos de un objeto deserializado.

La deserialización es el proceso de reconstruir el objeto desde el estado serializado. Es la operación inversa de la serialización. Veamos un ejemplo donde estamos leyendo los datos de un objeto deserializado.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Producción:

211 ravi 
descarga este ejemplo de deserialización

Serialización de Java con herencia (relación IS-A)

Si una clase implementa Interfaz serializable entonces todas sus subclases también serán serializables. Veamos el ejemplo que se da a continuación:

SerializeISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Producción:

 success 211 ravi Engineering 50000 

La clase SerializeISA ha serializado el objeto de clase Estudiante que extiende la clase Persona que es serializable. Las propiedades de la clase principal se heredan a las subclases, por lo que si la clase principal es serializable, la subclase también lo será.

¿Qué es el conjunto de hash de Java?

Serialización de Java con agregación (relación HAS-A)

Si una clase tiene una referencia a otra clase, todas las referencias deben ser serializables, de lo contrario no se realizará el proceso de serialización. En tal caso, Excepción no serializable se lanza en tiempo de ejecución.

Address.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Dado que la dirección no es serializable, no puede serializar la instancia de la clase Estudiante.

Nota: Todos los objetos dentro de un objeto deben ser serializables.

Serialización de Java con el miembro de datos estáticos

Si hay algún miembro de datos estáticos en una clase, no se serializará porque estático es parte de la clase, no un objeto.

Employee.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Serialización de Java con matriz o colección

Regla: en el caso de una matriz o colección, todos los objetos de la matriz o colección deben ser serializables. Si algún objeto no es serializable, la serialización fallará.

Exteriorizable en java

La interfaz externalizable proporciona la posibilidad de escribir el estado de un objeto en un flujo de bytes en formato comprimido. No es una interfaz de marcador.

La interfaz externalizable proporciona dos métodos:

    public void writeExternal (ObjectOutput out) lanza IOException lectura pública vacía externa (ObjectInput in) lanza IOException

Palabra clave transitoria de Java

Si no desea serializar ningún miembro de datos de una clase, puede marcarlo como transitorio.

Employee.java

descanso java
 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Ahora, la identificación no se serializará, por lo que cuando deserialice el objeto después de la serialización, no obtendrá el valor de la identificación. Siempre devolverá el valor predeterminado. En tal caso, devolverá 0 porque el tipo de datos de id es un número entero.

Visite la página siguiente para obtener más detalles.

SerialVersionUID

El proceso de serialización en tiempo de ejecución asocia una identificación con cada clase serializable que se conoce como SerialVersionUID. Se utiliza para verificar el remitente y el receptor del objeto serializado. El remitente y el destinatario deben ser el mismo. Para verificarlo se utiliza SerialVersionUID. El remitente y el receptor deben tener el mismo SerialVersionUID; de lo contrario, Excepción de clase no válida se lanzará cuando deserialice el objeto. También podemos declarar nuestro propio SerialVersionUID en la clase Serializable. Para hacerlo, debe crear un campo SerialVersionUID y asignarle un valor. Debe ser del tipo largo con estático y final. Se sugiere declarar explícitamente el campo serialVersionUID en la clase y tenerlo privado también. Por ejemplo:

 private static final long serialVersionUID=1L; 

Ahora, la clase Serializable se verá así:

Employee.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }