según Wikipedia, la serialización (o serialización) es el proceso de traducir estructuras de datos o estado de objeto a un formato que puede ser almacenado (por ejemplo, en un archivo o búfer de memoria) o transmitido (por ejemplo, a través de un enlace de conexión de red) y reconstruido más tarde (posiblemente en un entorno informático diferente).Cuando la serie de bits resultante se vuelve a leer de acuerdo con el formato de serialización, se puede utilizar para crear un clon semánticamente idéntico del objeto original.,
así que, básicamente, la Serialización es el proceso de convertir un objeto en una secuencia de bytes que se pueden almacenar en un disco o de la base de datos o puede ser enviado a través de los arroyos. El proceso inverso de crear un objeto a partir de una secuencia de bytes se llama deserialización.
serialización y deserialización en java
para serializar y deserializar nuestro objeto en un archivo necesitamos llamar a ObjectOutputStream.writeObject()
y ObjectInputStream.readObject()
.,
una clase debe implementar una interfaz Serializable presente en el paquete java.io
para serializar su objeto con éxito. Serializable es una interfaz de marcador que agrega un comportamiento serializable a la clase que lo implementa.
Java proporciona Serializable API encapsulado debajo de java.io
paquete para serializar y deserializar objetos que incluyen,
java.io.serializable
java.io.Externalizable
ObjectInputStream
- y
ObjectOutputStream
etc.,
Puntos para recordar
1. Si una clase padre ha implementado la interfaz Serializable, entonces la clase hija no necesita implementarla, pero viceversa no es verdadera.
2. Solo los miembros de datos no estáticos se guardan a través del proceso de serialización.3. Los miembros de datos estáticos y los miembros de datos transitorios no se guardan mediante serialización process.So, si no desea guardar el valor de un miembro de datos no estático, hágalo transitorio.
4., El Constructor de object nunca es llamado cuando un objeto es deserializado.
5. Los objetos asociados deben estar implementando una interfaz Serializable.
SerialVersionUID
El tiempo de ejecución de serialización asocia un número de versión con cada clase Serializable llamada SerialVersionUID, que se usa durante la deserialización para verificar que el emisor y el receptor de un objeto serializado han cargado clases para ese objeto que son compatibles con respecto a la serialización., Si el receptor ha cargado una clase para el objeto que tiene un UID diferente al de la clase del remitente correspondiente, la deserialización resultará en una InvalidClassException. Una clase Serializable puede declarar su propio UID explícitamente declarando un nombre de campo.debe ser estático, final y de tipo largo.
i.,e-ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;
si una clase serializable no declara explícitamente un serialVersionUID, entonces el tiempo de ejecución de serialización calculará uno predeterminado para esa clase basado en varios aspectos de la clase, como se describe en la especificación de serialización de objetos de Java. Sin embargo, se recomienda encarecidamente que todas las clases serializables declaren explícitamente el valor serialVersionUID, ya que su cálculo es altamente sensible a los detalles de la clase que pueden variar dependiendo de las implementaciones del compilador, cualquier cambio en la clase o el uso de diferentes id puede afectar a los datos serializados.,
también se recomienda usar el modificador privado para UID ya que no es útil como miembro heredado.
en el caso de variables transitorias: – una variable definida con palabra clave transitoria no se serializa durante el proceso de serialización.Esta variable se inicializará con el valor predeterminado durante la deserialización. (ej: para objetos es null, para int es 0).
En el caso de Variables estáticas: – una variable definida con la palabra clave estática no se serializa durante el proceso de serialización.Esta variable se cargará con el Valor Actual definido en la clase durante la deserialización.,
serialización en java
deserialización
el campo de contacto es nulo porque,fue marcado como estático y como hemos discutido anteriormente, los campos estáticos no se serializan.
Nota: los miembros estáticos nunca se serializan porque están conectados a la clase no al objeto de la clase.
- La serialización es el proceso de guardar el estado de un objeto en una secuencia de bytes que luego se pueden almacenar en un archivo o enviar a través de la red y la deserialización es el proceso de reconstruir un objeto a partir de esos bytes.,
- solo las subclases de la interfaz
Serializable
pueden ser serializadas. - si nuestra clase no implementa la interfaz
Serializable
o si tiene una referencia a una clase noSerializable
entonces JVM lanzaráNotSerializableException
. - Todos los
transient
ystatic
campos no obtener serializado. - El
serialVersionUID
se utiliza para verificar que los objetos serializados y deserializados tienen los mismos atributos y, por lo tanto, son compatibles con la deserialización., - debemos crear un campo
serialVersionUID
en nuestra clase, por lo que si cambiamos nuestra estructura de clases (agregando/eliminando campos) JVM no lo hará a través deInvalidClassException
. Si no lo proporcionamos, JVM proporciona uno que podría cambiar cuando cambie nuestra estructura de clases. - podemos anular el comportamiento de serialización predeterminado dentro de nuestra clase Java proporcionando la implementación de los métodos
writeObject
yreadObject
., - Y podemos llamar a
ObjectOutputStream.defaultWriteObject()
yObjectInputStream.defaultReadObject
desdewriteObject
yreadObject
métodos para obtener la lógica de serialización y deserialización por defecto. - podemos tirar
NotSerializableException
excepción dewriteObject
yreadObject
, si no queremos que nuestra clase que se va a serializar o deserializar.
Leave a Reply