Articles

¿cómo ocurre el proceso de deserialización en Java?

Posted by admin

en una de mis publicaciones anteriores relacionadas con «Implementing Serializable interface in java», El Sr. Bitoo hizo una buena pregunta «en el momento de la deserializtion, ¿cómo la JVM crea el objeto sin llamar al constructor??». Pensé en responderle en el mismo post en un comentario, pero en otro momento pensé en este un tema muy interesante que requiere un artículo detallado separado, así como la discusión con ustedes., Por lo tanto, Aquí Estoy comenzando la discusión con mi conocimiento limitado en este tema y los animaré a todos a poner sus pensamientos/consultas para que este tema sea claro para todos nosotros. Aquí empiezo.

ya hemos cubierto muchas cosas relacionadas con la serialización en java, y algunas cosas relacionadas con la deserialización en java también. No volveré a repetir lo mismo de nuevo y directamente llegaré al tema principal de discusión, es decir, ¿cómo funciona la deserialización en Java?

deserialización es el proceso por el cual el objeto previamente serializado es reconstruido de nuevo en su forma original, es decir., instancia de objeto. La entrada al proceso de deserialización es el flujo de bytes que obtenemos sobre el otro extremo de la red o simplemente lo leemos desde el sistema de archivos/base de datos. Una pregunta surge inmediatamente, ¿qué está escrito dentro de este flujo de bytes?

Leer más: Mini guía para implementar la interfaz serializable

para ser muy preciso, este flujo de bytes (o digamos datos serializados) tiene toda la información sobre la instancia que fue serializada por el proceso de serialización., Esta información incluye los metadatos de la clase, la información de tipo de los campos de instancia y los valores de los campos de instancia también. Esta misma información es necesaria cuando el objeto es reconstruido de nuevo a una nueva instancia de objeto. Al deserializar un objeto, la JVM lee sus metadatos de clase del flujo de bytes que especifica si la clase de un objeto implementa la interfaz ‘Serializable’ o ‘Externalizable’.,

tenga en cuenta que para que la deserialización ocurra sin problemas, el bytecode de una clase, cuyo objeto está siendo deserializado, debe estar presente dentro de la JVM que realiza la deserialización. De lo contrario, se lanza la’ ClassNotFoundException’. ¿No es demasiado obvio ??

si instance implementa la interfaz serializable, entonces se crea una instancia de la clase sin invocar a su constructor. ¿En serio? entonces, ¿cómo se crea el objeto si no se llama constructor?

echemos un vistazo al bytecode de un eprograma simple:

el bytecode anterior se ve real, ¿no?, En nuestra primera línea, vamos a empujar un valor de la «tabla de variables locales» a la pila. En este caso, realmente solo estamos empujando la referencia implícita a» esto», por lo que no es la instrucción más emocionante. La segunda instrucción es lo principal. En realidad invoca al constructor de super most class y en el caso anterior es Object.Java. Y una vez que el constructor de super most class (es decir, Object en este caso) ha sido llamado, rest of the code hace instrucciones específicas escritas en code.

coincidencia con el concepto anterior, p. ej., constructor de la clase super most, tenemos un concepto similar en deserialización. En el proceso de deserialización, se requiere que todas las clases padre de instancia sean serializables; y si cualquier superclase en hirarchy no es Serializable, entonces debe tener un constructor predeterminado. Ahora tiene sentido. Por lo tanto, mientras que la deserialización la clase super most se busca primero hasta que se encuentra cualquier clase no serializable. Si todas las superclases son serializables, JVM termina alcanzando la propia clase de objeto y crea una instancia de la clase de objeto primero., Si en medio de la búsqueda de las super clases, cualquier clase se encuentra NO serializable, entonces su constructor predeterminado se utilizará para asignar una instancia en memoria.

si cualquier super clase de instancia a ser serializada en no serializable y tampoco tiene un constructor predeterminado, entonces la’ NotSerializableException ‘ es lanzada por JVM.

Además, antes de continuar con la reconstrucción del objeto, la JVM comprueba si el serialVersionUID mencionado en la secuencia de bytes coincide con el serialVersionUID de la clase de ese objeto. Si no coincide, entonces se lanza la ‘InvalidClassException’.,

Leer más: SerialVersionUID en java y datos rápidos relacionados

así que hasta ahora tenemos la instancia ubicada en la memoria usando uno de Los Constructores predeterminados de superclass. Tenga en cuenta que después de esto no se llamará a ningún constructor para ninguna clase. Después de ejecutar super class constructor, JVM lee el flujo de bytes y usa los metadatos de la instancia para establecer la información de tipo y otra información meta de la instancia.,

después de crear la instancia en blanco, JVM primero establece sus campos estáticos y luego invoca internamente el método predeterminado readObject () que es responsable de establecer los valores de la secuencia de bytes en la instancia en blanco.

Leer más: código de ejemplo para readObject() y writeObject ()

después de completar el método readObject (), el proceso de deserialización se realiza y está listo para trabajar con una nueva instancia deserializada.

Leave A Comment