¿Qué se entiende por "serialización de objetos"? ¿Puedes explicarlo con algunos ejemplos?
java
serialization
object-serialization
Guerrero
fuente
fuente
Respuestas:
La serialización es la conversión de un objeto a una serie de bytes, de modo que el objeto se pueda guardar fácilmente en un almacenamiento persistente o transmitir a través de un enlace de comunicación. La secuencia de bytes se puede deserializar, convertir en una réplica del objeto original.
fuente
Puede pensar en la serialización como el proceso de convertir una instancia de objeto en una secuencia de bytes (que puede ser binaria o no dependiendo de la implementación).
Es muy útil cuando desea transmitir datos de un objeto a través de la red, por ejemplo, de una JVM a otra.
En Java, el mecanismo de serialización está integrado en la plataforma, pero debe implementar la interfaz serializable para que un objeto sea serializable.
También puede evitar que algunos datos en su objeto se serialicen marcando el atributo como transitorio .
Finalmente, puede anular el mecanismo predeterminado y proporcionar el suyo propio; Esto puede ser adecuado en algunos casos especiales. Para hacer esto, utiliza una de las funciones ocultas en Java .
Es importante notar que lo que se serializa es el "valor" del objeto, o los contenidos, y no la definición de clase. Por lo tanto, los métodos no están serializados.
Aquí hay una muestra muy básica con comentarios para facilitar su lectura:
Cuando ejecutamos este programa, se crea el archivo "o.ser" y podemos ver lo que sucedió detrás.
Si cambiamos el valor de: someInteger a, por ejemplo , Integer.MAX_VALUE , podemos comparar la salida para ver cuál es la diferencia.
Aquí hay una captura de pantalla que muestra precisamente esa diferencia:
¿Puedes ver las diferencias? ;)
Hay un campo adicional relevante en la serialización de Java: el serialversionUID pero supongo que esto ya es demasiado largo para cubrirlo.
fuente
SerializationSample
SerializationSample instance = new SerializationSample();
luego se crea la salida y se escribe el objeto en esa salida.Atreverse a responder la pregunta de hace 6 años, agregando solo una comprensión de muy alto nivel para las personas nuevas en Java
Convertir un objeto a bytes
Convertir bytes nuevamente a un objeto (Deserialización).
Cuando queremos persistir el objeto. Cuando queremos que el objeto exista más allá de la vida útil de la JVM.
Cajero automático: cuando el titular de la cuenta intenta retirar dinero del servidor a través del cajero automático, la información del titular de la cuenta, como los detalles del retiro, se serializará y se enviará al servidor donde los detalles se deserializan y se utilizan para realizar operaciones.
java.io.Serializable
Interfaz de implementación (interfaz de marcador, por lo que no hay ningún método para implementar).Persistir el objeto: utilice la
java.io.ObjectOutputStream
clase, una secuencia de filtro que es una envoltura alrededor de una secuencia de bytes de nivel inferior (para escribir objetos en sistemas de archivos o transferir un objeto aplanado a través de un cable de red y reconstruido en el otro lado).writeObject(<<instance>>)
- para escribir un objetoreadObject()
- para leer un objeto serializadoCuando serializa un objeto, solo se guardará el estado del objeto, no el archivo de clase o los métodos del objeto.
Cuando serializa un objeto de 2 bytes, ve un archivo serializado de 51 bytes.
Respuesta para: ¿Cómo se convirtió al archivo de 51 bytes?
java.lang.Object
.Editar : un buen enlace más para leer.
Esto responderá algunas preguntas frecuentes:
Cómo no serializar ningún campo en clase.
Respuesta: use palabras clave transitorias
Cuando la clase secundaria se serializa, ¿se serializa la clase primaria?
Respuesta: No, si un padre no amplía el campo de padres de la interfaz serializable, no se serialice.
Cuando un padre se serializa, ¿se serializa la clase secundaria?
Respuesta: Sí, por defecto, la clase secundaria también se serializa.
¿Cómo evitar que la clase infantil se serialice?
Respuesta: a. Reemplazar el método writeObject y readObject y throw
NotSerializableException
.si. También puede marcar todos los campos como transitorios en la clase secundaria.
fuente
La serialización es tomar un objeto "vivo" en la memoria y convertirlo a un formato que pueda almacenarse en algún lugar (por ejemplo, en la memoria, en el disco) y luego "deserializarse" de nuevo en un objeto vivo.
fuente
Me gustó la forma en que @OscarRyz presenta. Aunque aquí continúo la historia de serialización que originalmente fue escrita por @amitgupta.
Aunque conocer la estructura de clase del robot y haber serializado los datos, el científico de la Tierra no pudo deserializar los datos que pueden hacer que los robots funcionen.
Los científicos de Marte estaban esperando el pago completo. Una vez realizado el pago, los científicos de Marte compartieron el serialversionUID con los científicos de la Tierra. El científico de la Tierra lo estableció en la clase de robot y todo se puso bien.
fuente
Serialización significa objetos persistentes en java. Si desea guardar el estado del objeto y desea reconstruir el estado más adelante (puede estar en otra JVM) se puede utilizar la serialización.
Tenga en cuenta que las propiedades de un objeto solo se guardarán. Si desea resucitar el objeto nuevamente, debe tener el archivo de clase, porque las variables miembro solo se almacenarán y no las funciones miembro.
p.ej:
El buscador es una interfaz de marcador que marca que su clase es serializable. La interfaz de marcador significa que es solo una interfaz vacía y el uso de esa interfaz notificará a la JVM que esta clase puede hacerse serializable.
fuente
Mis dos centavos de mi propio blog:
Aquí hay una explicación detallada de la serialización : (mi propio blog)
Publicación por entregas:
La serialización es el proceso de persistencia del estado de un objeto. Se representa y almacena en forma de una secuencia de bytes. Esto se puede almacenar en un archivo. El proceso para leer el estado del objeto del archivo y restaurarlo se llama deserialización.
¿Cuál es la necesidad de la serialización?
En la arquitectura moderna, siempre es necesario almacenar el estado del objeto y luego recuperarlo. Por ejemplo, en Hibernate, para almacenar un objeto debemos hacer que la clase Serializable. Lo que hace es que una vez que el estado del objeto se guarda en forma de bytes, se puede transferir a otro sistema que luego puede leer el estado y recuperar la clase. El estado del objeto puede provenir de una base de datos o una jvm diferente o de un componente separado. Con la ayuda de la serialización podemos recuperar el estado del objeto.
Código de ejemplo y explicación:
Primero echemos un vistazo a la clase de artículo:
En el código anterior se puede ver que la clase Item implementa Serializable .
Esta es la interfaz que permite que una clase sea serializable.
Ahora podemos ver que una variable llamada serialVersionUID se inicializa en Variable larga. El compilador calcula este número basándose en el estado de la clase y los atributos de la clase. Este es el número que ayudará a la jvm a identificar el estado de un objeto cuando lee el estado del objeto del archivo.
Para eso podemos echar un vistazo a la documentación oficial de Oracle:
Si ha notado que hay otra palabra clave que hemos usado que es transitoria .
Si un campo no es serializable, debe marcarse como transitorio. Aquí marcamos el itemCostPrice como transitorio y no queremos que se escriba en un archivo
Ahora echemos un vistazo a cómo escribir el estado de un objeto en el archivo y luego leerlo desde allí.
En lo anterior podemos ver un ejemplo de serialización y deserialización de un objeto.
Para eso usamos dos clases. Para serializar el objeto, hemos utilizado ObjectOutputStream. Hemos utilizado el método writeObject para escribir el objeto en el archivo.
Para la deserialización, hemos utilizado ObjectInputStream que lee del objeto del archivo. Utiliza readObject para leer los datos del objeto del archivo.
El resultado del código anterior sería como:
Tenga en cuenta que itemCostPrice del objeto deserializado es nulo ya que no se escribió.
Ya hemos discutido los conceptos básicos de la serialización Java en la parte I de este artículo.
Ahora discutamos profundamente y cómo funciona.
Primero comencemos con el serialversionuid.
El serialVersionUID se utiliza como un control de versión en una clase Serializable.
Si no declara explícitamente un serialVersionUID, JVM lo hará por usted automáticamente, en función de varias propiedades de la clase Serializable.
Algoritmo de Java para calcular serialversionuid (Lea más detalles aquí)
Algoritmo de serialización de Java
Cosas a tener en cuenta:
Los campos estáticos en una clase no se pueden serializar.
Si serialversionuid es diferente en la clase de lectura, arrojará una
InvalidClassException
excepción.Si una clase implementa serializable, todas sus subclases también serán serializables.
Si una clase tiene una referencia de otra clase, todas las referencias deben ser serializables, de lo contrario no se realizará el proceso de serialización. En tal caso, NotSerializableException se lanza en tiempo de ejecución.
P.ej:
fuente
serialVersionUID
es diferente arrojará unInvalidClassException
, no unClassCastException
. No es necesario desperdiciar todo ese espacio respetando laserialVersionUID
computación. La documentación se cita, con una extensión excesiva, pero no está vinculada ni se cita adecuadamente. Demasiada pelusa aquí y demasiados errores.La serialización es el proceso de convertir el estado de un objeto en bits para que pueda almacenarse en un disco duro. Cuando deserializa el mismo objeto, conservará su estado más adelante. Le permite recrear objetos sin tener que guardar las propiedades de los objetos a mano.
http://en.wikipedia.org/wiki/Serialization
fuente
Serialización de objetos Java
Serialization
es un mecanismo para transformar un gráfico de objetos Java en una matriz de bytes para almacenamiento (to disk file
) o transmisión (across a network
), luego mediante deserialización , podemos restaurar el gráfico de objetos. Los gráficos de objetos se restauran correctamente utilizando un mecanismo para compartir referencias. Pero antes de almacenar, verifique si serialVersionUID de input-file / network y .class file serialVersionUID son iguales. Si no, tira unjava.io.InvalidClassException
.serialVersionUID es esencial para el proceso de serialización. Pero es opcional para el desarrollador agregarlo al archivo fuente de Java. Si no se incluye un serialVersionUID, el tiempo de ejecución de serialización generará un serialVersionUID y lo asociará con la clase. El objeto serializado contendrá este serialVersionUID junto con otros datos.
Nota : se recomienda encarecidamente que todas las clases serializables declaren explícitamente un serialVersionUID,
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
, pueden dar lugar a conflictos inesperados de serialVersionUID durante la deserialización, lo que hace que la deserialización falle.Inspección de clases serializables
Una clase debe implementar la interfaz java.io.Serializable para serializar su objeto con éxito. Serializable es una interfaz de marcador y se utiliza para informar al compilador que la clase que lo implementa tiene que agregar un comportamiento serializable. Aquí Java Virtual Machine (JVM) es responsable de su serialización automática.
La implementación de la interfaz Externalizable permite que el objeto asuma un control completo sobre el contenido y el formato de la forma serializada del objeto. Los métodos de la interfaz Externalizable, writeExternal y readExternal, se llaman para guardar y restaurar el estado de los objetos. Cuando los implementa una clase, pueden escribir y leer su propio estado utilizando todos los métodos de ObjectOutput y ObjectInput. Es responsabilidad de los objetos manejar cualquier versión que ocurra.
Solo los objetos que admiten la interfaz java.io.Serializable o java.io.Externalizable pueden ser
written to
/read from
streams. La clase de cada objeto serializable se codifica incluyendo el nombre de la clase y la firma de la clase, los valores de los campos y matrices del objeto, y el cierre de cualquier otro objeto referenciado desde los objetos iniciales.Ejemplo serializable para archivos
Ejemplo serializable a través de la red
Objeto de distribución el estado del través de diferentes espacios de direcciones, ya sea en diferentes procesos en la misma computadora, o incluso en varias computadoras conectadas a través de una red, pero que trabajan juntas al compartir datos e invocar métodos.
@ver
fuente
JVM to JVM
La serialización es el proceso de guardar un objeto en un medio de almacenamiento (como un archivo o un búfer de memoria) o transmitirlo a través de una conexión de red en forma binaria. Los objetos serializados son independientes de JVM y cualquier JVM puede volver a serializarlos. En este caso, el estado de los objetos Java "en memoria" se convierte en un flujo de bytes. Este tipo de archivo no puede ser entendido por el usuario. Es un tipo especial de objeto, es decir, reutilizado por la JVM (Java Virtual Machine). Este proceso de serialización de un objeto también se llama desinflar o ordenar un objeto.
El objeto a serializar debe implementar la
java.io.Serializable
interfaz. El mecanismo de serialización predeterminado para un objeto escribe la clase del objeto, la firma de la clase y los valores de todos los campos no transitorios y no estáticos.ObjectOutput
interfaz extiende laDataOutput
interfaz y agrega métodos para serializar objetos y escribir bytes en el archivo. La interfaz seObjectOutputStream
extiendejava.io.OutputStream
e implementaObjectOutput
. Serializa objetos, matrices y otros valores en una secuencia. Así, el constructor deObjectOutputStream
se escribe como:El código anterior se ha utilizado para crear la instancia de la
ObjectOutput
clase con elObjectOutputStream( )
constructor que toma la instancia deFileOuputStream
como parámetro.La
ObjectOutput
interfaz se usa implementando laObjectOutputStream
clase. ElObjectOutputStream
está construido para serializar el objeto.Deserializar un objeto en java
La operación opuesta de la serialización se llama deserialización, es decir, extraer los datos de una serie de bytes se conoce como deserialización, que también se llama inflar o desarmar.
ObjectInputStream
extiendejava.io.InputStream
e implementa laObjectInput
interfaz. Deserializa objetos, matrices y otros valores de una secuencia de entrada. Así, el constructor deObjectInputStream
se escribe como:El código anterior del programa crea la instancia de la
ObjectInputStream
clase para deserializar ese archivo que había sido serializado por laObjectInputStream
clase. El código anterior crea la instancia utilizando la instancia de laFileInputStream
clase que contiene el objeto de archivo especificado que debe ser deserializado porque elObjectInputStream()
constructor necesita la secuencia de entrada.fuente
La serialización es el proceso de convertir un objeto Java en una matriz de bytes y luego volverlo a convertir en objeto nuevamente con su estado preservado. Útil para varias cosas como enviar objetos a través de la red o almacenar en caché cosas en el disco.
Lea más de este breve artículo que explica bastante bien la programación del proceso y luego pase a Serializable javadoc . También puede estar interesado en leer esta pregunta relacionada .
fuente
Devuelva el archivo como un Objeto: http://www.tutorialspoint.com/java/java_serialization.htm
fuente
| * | Serializar una clase: Convertir un objeto a bytes y bytes nuevamente a objeto (Deserialización).
| => La serialización de objetos es el proceso de convertir el estado de un objeto en vapor de bytes.
| => Object-Deserialization es el proceso de obtener el estado de un objeto y almacenarlo en un objeto (java.lang.Object).
& nbsp & nbsp Si no arroja java.io.InvalidClassException.
| => Un objeto Java solo es serializable, si su clase o alguna de sus superclases
| => Los campos estáticos en una clase no se pueden serializar.
| => Si no desea serializar una variable de una clase, utilice la palabra clave transitoria
| => Si una clase implementa serializable, todas sus subclases también serán serializables.
| => Si una clase tiene una referencia de otra clase, todas las referencias deben ser serializables, de lo contrario no se realizará el proceso de serialización. En tal caso,
NotSerializableException se lanza en tiempo de ejecución.
fuente
Ofreceré una analogía para ayudar potencialmente a solidificar el propósito conceptual / practicidad de la serialización / deserialización de objetos .
Me imagino la serialización / deserialización de objetos en el contexto de intentar mover un objeto a través de un drenaje pluvial. El objeto está esencialmente "descompuesto" o serializado en versiones más modulares de sí mismo, en este caso, una serie de bytes , para que se le permita pasar efectivamente a través de un medio. En un sentido computacional, podríamos ver la ruta recorrida por los bytes a través del drenaje pluvial como similar a los bytes que viajan a través de una red. Estamos transmutando nuestro objeto para adaptarnos a un modo de transporte o formato más deseable. El objeto serializado generalmente se almacenará en un archivo binario que luego se puede leer, escribir o ambos.
Quizás una vez que nuestro objeto pueda deslizarse a través del drenaje como una serie descompuesta de bytes, es posible que deseemos almacenar esa representación del objeto como datos binarios dentro de una base de datos o unidad de disco duro. Sin embargo, la conclusión principal es que con la serialización / deserialización, tenemos la opción de dejar que nuestro objeto permanezca en su forma binaria después de ser serializado, o "recuperar" la forma original del objeto realizando la deserialización.
fuente