mvc - what is a singleton in java
Serialización Java: readObject() vs. readResolve() (9)
Cuando la serialización se usa para convertir un objeto para que se pueda guardar en un archivo, podemos activar un método, readResolve (). El método es privado y se mantiene en la misma clase cuyo objeto se está recuperando durante la deserialización. Asegura que después de la deserialización, qué objeto se devuelve es el mismo que se serializó. Es decir, instanceSer.hashCode() == instanceDeSer.hashCode()
El método readResolve () no es un método estático. Después de in.readObject()
durante la deserialización, solo se asegura de que el objeto devuelto sea el mismo que el que se serializó como se muestra a continuación mientras out.writeObject(instanceSer)
..
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("file1.ser"));
out.writeObject(instanceSer);
out.close();
De esta manera, también ayuda en la implementación del patrón de diseño singleton , porque cada vez se devuelve la misma instancia.
public static ABCSingleton getInstance(){
return ABCSingleton.instance; //instance is static
}
El libro Effective Java y otras fuentes proporcionan una explicación bastante buena sobre cómo y cuándo usar el método readObject () cuando se trabaja con clases Java serializables. El método readResolve (), por otro lado, sigue siendo un misterio. Básicamente, todos los documentos que encontré mencionan solo uno de los dos o mencionan ambos solo de forma individual.
Las preguntas que permanecen sin respuesta son:
- ¿Cuál es la diferencia entre los dos métodos?
- ¿Cuándo debe implementarse el método?
- ¿Cómo se debe usar readResolve (), especialmente en términos de devolver qué?
Espero que puedan arrojar algo de luz sobre este asunto.
El método readResolve
se ObjectInputStream
cuando ObjectInputStream
ha leído un objeto de la transmisión y se está preparando para devolverlo a la persona que llama. ObjectInputStream
comprueba si la clase del objeto define el método readResolve
. Si se define el método, se llama al método readResolve
para permitir que el objeto en la secuencia designe el objeto que se devolverá. El objeto devuelto debe ser de un tipo que sea compatible con todos los usos. Si no es compatible, se lanzará una ClassCastException
cuando se descubra el desajuste de tipo.
readObject () es un método existente en ObjectInputStream class.while reading object en el momento de la deserialización readObject method internamente verifica si el objeto de clase que se está deserializando tiene el método readResolve o no si el método readResolve existe, invocará el método readResolve y devolverá el mismo ejemplo.
Por lo tanto, la práctica intensa de escribir el método readResolve es una buena práctica para lograr un patrón de diseño único puro en el que nadie pueda obtener otra instancia serializando / deserializando.
readResolve () asegurará el contrato singleton durante la serialización.
Por favor refer
readResolve es para cuando puede necesitar devolver un objeto existente, por ejemplo, porque está buscando entradas duplicadas que deberían combinarse o (por ejemplo, en sistemas distribuidos consistentes) porque es una actualización que puede llegar antes de que se dé cuenta cualquier versión anterior.
readResolve se puede usar para cambiar los datos que se serializan mediante el método readObject. Por ejemplo, xstream API utiliza esta característica para inicializar algunos atributos que no estaban en el XML a deserializar.
readResolve
se readResolve
después de que readObject
haya retornado (a la inversa se llama writeObject
antes de writeObject
y probablemente en un objeto diferente). El objeto que devuelve el método reemplaza this
objeto devuelto al usuario de ObjectInputStream.readObject
y cualquier referencia posterior al objeto en la secuencia. Se usa principalmente para proxies en serie (ver Effective Java, 2nd Ed, IIRC).
readResolve
se usa para reemplazar el objeto leído de la secuencia. El único uso que he visto para esto es aplicar singletons; cuando se lee un objeto, reemplácelo con la instancia singleton. Esto garantiza que nadie pueda crear otra instancia serializando y deserializando el singleton.
El método readResolve
Para las clases Serializable y Externalizable, el método readResolve permite que una clase reemplace / resuelva el objeto leído de la transmisión antes de devolverlo a la persona que llama. Al implementar el método readResolve, una clase puede controlar directamente los tipos y las instancias de sus propias instancias que están deserializadas. El método se define de la siguiente manera:
ANY-ACCESS-MODIFIER El objeto readResolve () arroja ObjectStreamException;
El método readResolve se invoca cuando ObjectInputStream ha leído un objeto de la transmisión y se está preparando para devolverlo a la persona que llama. ObjectInputStream comprueba si la clase del objeto define el método readResolve. Si se define el método, se llama al método readResolve para permitir que el objeto en la secuencia designe el objeto que se devolverá. El objeto devuelto debe ser de un tipo que sea compatible con todos los usos. Si no es compatible, se lanzará una ClassCastException cuando se descubra el desajuste de tipo.
Por ejemplo, se podría crear una clase Symbol para la cual solo existiera una instancia única de cada enlace de símbolos dentro de una máquina virtual. El método readResolve se implementaría para determinar si ese símbolo ya estaba definido y sustituir el objeto Symbol equivalente preexistente para mantener la restricción de identidad. De esta manera, la singularidad de los objetos Symbol se puede mantener a través de la serialización.