¿Cuál es el concepto de serialización en Java?



Este artículo ayudará con un enfoque integral hacia el concepto de serialización en Java junto con ejemplos en tiempo real para una mejor comprensión.

Serialización en es un concepto importante que se ocupa de la conversión de objetos en un flujo de bytes para transportar los objetos java de una máquina virtual Java a otra y recrearlos a la forma original. Alinearé el expediente para este artículo de la siguiente manera:

¿Qué es la serialización en Java?

Publicación por entregas en Java es el proceso de convertir el código Java Objeto en una Flujo de bytes , para transferir el código de objeto de una máquina virtual Java a otra y volver a crearlo utilizando el proceso de Deserialización.





Serialization-in-Java-Edureka-Picture-1

¿Por qué necesitamos serialización? en Java ?

Necesitamos serialización por las siguientes razones:



  • Comunicación : La serialización implica el procedimiento de objeto publicación por entregas y transmisión. Esto permite que múltiples sistemas informáticos diseñen, compartan y ejecuten objetos simultáneamente.

    cómo combinar datos en tableau
  • Almacenamiento en caché : El tiempo consumido en la construcción de un objeto es mayor en comparación con el tiempo necesario para deserializarlo. La serialización minimiza el consumo de tiempo caché los objetos gigantes.

  • Copia profunda : Clonación El proceso se simplifica utilizando Serialización. Un exacto réplica de un objeto se obtiene porserializando el objeto a un matriz de bytes y luego deserializarlo.



  • Cruzar Sincronización de JVM: La principal ventaja de la serialización es quefunciona en diferentes JVM que pueden estar ejecutándose en diferentes arquitecturas o Sistemas operativos

  • Persistencia: El estado de cualquier objeto se puede almacenar directamente aplicando serialización y se puede almacenar en un base de datos para que pueda ser recuperado más tarde.

¿Cómo serializamos un objeto?

A Objeto Java es serializable si y solo si su clase o cualquiera de sus clases padre implementan el Java . yo . Serializable interfaz o su subinterfaz, java.io.Externalizable.

En el proceso de serialización, convertimos el estado de un objeto en un flujo de bytes para que pueda ser transferido de una JVM a otra y revertir el flujo de bytes al objeto original.

//Interfaz

paquete Serial1 import java.io.Serializable public class Empleado implementa Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

//Publicar por fascículos

package Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = nuevo Empleado (20120, 'Sam') FileOutputStream fout = nuevo FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('La serialización y deserialización se ejecutaron con éxito')} catch (Exception e) {System.out.println (e)}}}

Salida:

La serialización y deserialización se han ejecutado con éxito

Deserialización : Es el proceso inverso de serialización donde el flujo de bytes serializados de un objeto del remitente se recrea en el extremo receptor.

// Deserializar

paquete Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Empleado e2 = (Empleado) in.readObject () Empleado e3 = (Empleado) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Exception e) {System.out.println (e)}}}

Salida:

20110 Juan
22110 Jerry

20120 Sam

Ventajas y desventajas de la serialización en Java

Ventajas:

  • El proceso de serialización es un incorporado función que no requiere software de terceros para ejecutar la serialización
  • Se ha demostrado que el procedimiento de serialización simple y fácil comprender

  • El procedimiento de serialización es universal y los desarrolladores de diferentes antecedentes lo conocen

  • Es fácil de usar y simple de personalizar

  • Flujos de datos serializados admite cifrado, compresión, autenticación y informática Java segura

  • Hay muchos tecnologías críticas confiando en la serialización.

Desventajas:

  • Objetos mientras la desserialización se convierte frágil y no están seguros de ser desserializados de manera efectiva.

  • Las variables transitorias declaradas mientras que la serialización crea espacio de memoria, pero no se llama al constructor, lo que da como resultado una falla en la inicialización de las variables transitorias que resulta variación del flujo estándar de Java.

  • El proceso de serialización es ineficiente en términos de utilización de la memoria.

  • No es preferible utilizar la serialización en las aplicaciones que necesitan acceso concurrente sin el requisito de API de terceros , ya que la serialización no ofrece ningún mecanismo de control de transición por cada SE.

  • El procedimiento de serialización no se ofrece control de grano fino para acceder a Objetos.

Ejemplos prácticos de serialización en Java

Serialización mediante herencia

Caso - 1: Si Superclase es serializable, entonces, por defecto, sus subclases también son serializables.

En este caso, el subclase es serializable por defecto si el superclase está implementando el Interfaz serializable

paquete SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable clase A implementa Serializable {int i public A (int i) {this.i = i}} clase B se extiende A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) throws Exception {B b1 = nuevo B (200,400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = nuevo FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('El objeto ha sido serializado') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('El objeto ha sido deserializado') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Salida:

j = 20
El objeto ha sido serializado
El objeto ha sido deserializado
i = 200
j = 400

Caso 2: una subclase se puede serializar si implementa la interfaz serializable incluso si una superclase no implementa la interfaz serializable.

En este caso, si el superclase no está implementando el Interfaz serializable , entonces, los objetos del subclase se puede serializar manualmente implementando la interfaz serializable en la subclase.

paquete SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} public superclase () {i = 50 System.out.println ('constructor de superclase llamado')}} clase subclase extiende superclase implementa Serializable {int j subclase pública (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) throws Exception {subclase b1 = nueva subclase (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('El objeto ha sido serializado') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclase b2 = (subclase) ois.readObject ( ) ois.close () fis.close () System.out.println ('El objeto ha sido deserializado') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

El objeto ha sido serializado
Constructor de superclase llamado
El objeto ha sido deserializado
i = 50
j = 20

tableau cómo crear un conjunto

Caso - 3: Si la superclase es serializable, pero no necesitamos que la subclase sea serializada.

En este caso, se puede evitar la serialización de la subclaseimplementando el writeObject () y readObject () métodos en la subclase y necesita lanzar NotSerializableException de estos métodos.

paquete SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.ObjectOutputStream import java.io.Serializable class { i public Parent (int i) {this.i = i}} class child extiende Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) throws IOException {lanzar nueva NotSerializableException ()} private void readObject (ObjectInputStream in) lanza IOException {lanzar nueva NotSerializableException ()}} public class test3 {public static void main (String [] args) throws Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = nuevo ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objeto se ha serializado ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('El objeto ha sido deserializado') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Salida:

i = 100
j = 200
Excepción en el hilo 'principal' java.io.NotSerializableException
en SerializationInheritance.child.writeObject (test3.java:48)
en sun.reflect.NativeMethodAccessorImpl.invoke0 (método nativo)

Serialización mediante un miembro estático

La serialización del campo de miembro estático se ignora en el proceso de serialización. La serialización esrelacionado con el estado más reciente del objeto. Por lo tanto, solo los datos asociados con una instancia específica de una clase sonserializado pero no el campo de miembro estático.

paquete stati import java.io. * class StaticSerial implementa Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('En el momento de la serialización, El miembro estático tiene valor: '+ i) try {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = new FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Después de la deserialización, el miembro estático tiene valor:' + i)} catch (Excepción e) {System.out.println (e)}}}

Salida:

En el momento de la serialización, el miembro estático tiene un valor: 100
Después de la deserialización, el miembro estático tiene un valor: 99

Interfaz externalizable

los Interfaz externalizable en Java es similar a la serialización, pero la única diferencia es que es capaz de ofrecer serialización personalizada donde puedes decidir los objetos que se van a ensanchar en la secuencia.

La interfaz Externalizable está disponible en java.io y proporciona dos métodos:

  • public void writeExternal (ObjectOutput out) lanza IOException
  • public void readExternal (ObjectInput in) lanza IOException

Las diferencias clave entre serialización y externalizables son las siguientes:

  • Implementación : La interfaz externalizable excluye al usuario explícitamente mencione los objetos a serializar. En la interfaz de serialización, todos los objetos y variables se serializan en el tiempo de ejecución.

  • Métodos : La interfaz externalizable consta de dos métodos, a saber:

    • writeExternal ()

    • readExternal ()

Considerando que, la interfaz serializable no incluye ningún método.

  • Proceso: El proceso de serialización en la interfaz externalizable proporciona personalización al proceso de serialización. Pero, la interfaz de serialización proporcionará la defecto proceso de serialización.

  • Compatibilidad y control hacia atrás: La interfaz externalizable admite la serialización independientemente de la control de versiones y el único problema es que el usuario debe ser responsable al serializar Super Class. Por otro lado, la interfaz de serialización requiere misma versión de JVM en ambos extremos, pero incorpora la serialización automática de todos los objetos y clases, incluida la superclase.

  • Constructor público No-Arg: Necesidades de la interfaz de externalización Constructor público No-Arg para reconstruir el objeto serializado. Si bien la interfaz de serialización no requiere el constructor No-Arg, en su lugar usa reflexión para reconstruir el objeto o la clase serializados.

paquete ext import java.io. * class Demo implementa java.io.Serializable {public int a public String b 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, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (objeto) out.close () file.close () System.out.println ('El objeto ha sido serializado')} catch (IOException ex) {System.out.println ('IOException is catch')} Demo object1 = null try {FileInputStream file = new FileInputStream (nombre de archivo) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('El objeto ha sido deserializado ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException es capturado ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException es capturada')}}}

Palabra clave transitoria

La palabra clave transitoria es una palabra clave reservada en Java. Se utiliza como modificar variable en el momento del proceso de serialización. Declarar una variable con la palabra clave Transient evita que la variable sea serializada.

UID de la versión de serie

Antes de que comience el proceso de serialización, cada clase / objeto serializable se asocia con un número de identificación único proporcionado por la JVM de la máquina host. Este ID único se llama UID de la versión de serie . La JVM utiliza este UID como identificación del extremo receptor para confirmar que el mismo objeto se está desserializando en el extremo receptor.

Controversias de la serialización en Java

De Oracle Los arquitectos tienen la intención de eliminar la serialización de Java, ya que lo consideran como un Error horrible de 1997 . Después de una intensa investigación, los desarrolladores de Oracle descubrieron algunas fallas en el diseño del procedimiento de serialización que representan una amenaza para los datos.

En el año 1997,Mark Reinhold afirma: ' Nos gusta llamar a la serialización 'el regalo que sigue dando', y el tipo de regalo que sigue dando son vulnerabilidades de seguridad. Probablemente un tercio de todas las vulnerabilidades de Java han involucrado la serialización, podría ser más de la mitad. Es una fuente de vulnerabilidades asombrosamente fecunda, por no hablar de inestabilidades ”.

Hay posibilidades de que la serialización sea eliminada o reemplazada en las próximas actualizaciones de Java y, por otro lado, para un principiante en Java, serialización no pude ser una opción idealista en sus proyectos

Prácticas recomendadas al utilizar la serialización en Java

Las siguientes son algunas de las mejores prácticas que deben seguirse

  • Se recomienda su uso javadoc @ etiqueta de serie para denotar campos serializables.
  • los .ser se prefiere utilizar la extensión para archivos que representan objetos serializados.
  • No se recomienda que ningún campo estático o transitorio sufra serialización predeterminada.
  • Clases extensibles no debe ser serializado a menos que sea obligatorio.
  • Clases internas debe evitarse participar en la serialización.

Con esto, llegamos al final de este artículo. Espero que haya entendido los conceptos básicos de la serialización en Java, sus tipos y sus funcionalidades.

Revisar la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para estudiantes y profesionales que desean ser desarrolladores de Java. El curso está diseñado para darle una ventaja inicial en la programación de Java y capacitarlo para los conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Primavera .

Tienes una pregunta para nosotros? Menciónelo en la sección de comentarios de este artículo de “Serialización en Java” y nos pondremos en contacto con usted lo antes posible.