146 votes

La sérialisation Java: readObject() vs readResolve()

Le livre Efficace, Java et d'autres sources fournissent une très bonne explication sur comment et quand utiliser les méthodes readObject() la méthode lorsque l'on travaille avec la sérialisation des classes Java. Le readResolve() la méthode, sur l'autre main, reste un peu un mystère. Fondamentalement, tous les documents que j'ai trouvés ne citer que l'un des deux ou une mention à la fois individuellement.

Des Questions qui restent sans réponses sont:

  • Quelle est la différence entre les deux méthodes?
  • Quand devrais-la méthode de mise en œuvre?
  • Comment doit-readResolve() peut être utilisé, en particulier en termes de retour de quoi?

J'espère que vous pouvez jeter un peu de lumière sur cette question.

167voto

Michael Myers Points 82361

readResolve est utilisé pour le remplacement de l'objet lu à partir du flux. La seule utilisation que j'ai jamais vu pour ce qui est de l'application de singletons; lorsqu'un objet est en lecture, le remplacer par l'instance du singleton. Cela garantit que personne ne peut créer une autre instance par la sérialisation et la désérialisation du singleton.

40voto

AZ_ Points 7127

Le readResolve méthode est appelée lorsque ObjectInputStream a lu un objet à partir de la rivière et se prépare à retourner à l'appelant. ObjectInputStream vérifie si la classe de l'objet définit la readResolve méthode. Si la méthode est définie, la readResolve méthode est appelée pour permettre l'objet dans le flux de désigner l'objet doit être retourné. L'objet retourné doit être d'un type qui est compatible avec toutes les utilisations. Si elle n'est pas compatible, une ClassCastException sera générée lorsque l'incompatibilité de type est découvert.

36voto

readResolve est appelée après l' readObject a renvoyé (à l'inverse writeReplace avant writeObject et probablement sur un autre objet). L'objet de la méthode renvoie remplace this objet renvoyé à l'utilisateur d' ObjectInputStream.readObject et tout remonter plus loin les références à l'objet dans le flux. Il est principalement utilisé pour la série des procurations (voir Effective Java, 2nd Ed, IIRC).

9voto

endless Points 329

readResolve peut être utilisé pour modifier les données sérialisées par le biais de la méthode readObject. Pour, par exemple, l'API xstream utilise cette fonction pour initialiser des attributs qui ne sont pas dans le XML être désérialisé.

http://xstream.codehaus.org/faq.html#Serialization

5voto

user833771 Points 21

readResolve est pour quand vous pouvez avoir besoin de retourner un objet existant, par exemple, parce que vous êtes à la vérification de dupliquer les entrées doivent être fusionnés, ou (par exemple, en fin de compte cohérente des systèmes distribués) parce que c'est une mise à jour qui peut arriver avant que vous êtes au courant de toutes les anciennes versions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X