Serialización Java: readObject () vs. readResolve ()


Answers

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.

Question

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

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.




readResolve () asegurará el contrato singleton durante la serialización.
Por favor refer




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.

http://x-stream.github.io/faq.html#Serialization




Links