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

Le livre Effective 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. La méthode readResolve (), d'un autre côté, reste un peu un mystère. En gros, tous les documents que j'ai trouvés mentionnent seulement l'un des deux ou les deux seulement individuellement.

Questions qui restent sans réponse sont:

  • qu'est-Ce que la différence entre les deux méthodes?
  • quand mettre en œuvre quelle méthode?
  • comment readResolve() doit-il être utilisé, en particulier en termes de retour de quoi?

j'espère que vous pourrez nous éclairer sur cette question.

109
demandé sur Aniket Thakur 2009-07-23 01:25:48

9 réponses

readResolve est utilisé pour en remplacement de l'objet est lu dans le ruisseau. La seule utilisation que j'ai jamais vu pour cela est l'exécution de singletons; lorsqu'un objet est lu, remplacez-le par l'instance singleton. Cela garantit que personne ne peut créer une autre instance en sérialisant et en desérialisant le singleton.

110
répondu Michael Myers 2009-07-22 21:31:23

la méthode readResolve est appelée lorsque ObjectInputStream a lu un objet du flux et se prépare à le retourner à l'appelant. ObjectInputStream vérifie si la classe de l'objet définit la méthode readResolve . Si la méthode est définie, la readResolve la méthode est appelée à autoriser l'objet dans le flux de désigner l'objet doit être retourné. L'objet retourné doit être d'un type compatible avec tous les usages. S'il n'est pas compatible, un ClassCastException sera lancé lorsque le décalage de type est découvert.

33
répondu AZ_ 2015-01-20 02:41:52

readResolve est appelé après readObject est revenu (à l'inverse writeReplace est appelé avant writeObject et probablement sur un objet différent). L'objet que la méthode retourne remplace this objet retourné à l'utilisateur de ObjectInputStream.readObject et toute référence ultérieure à l'objet dans le flux. Il est principalement utilisé pour les mandataires en série (Voir Java efficace, 2e éd., IIRC).

24
répondu Tom Hawtin - tackline 2013-08-07 07:16:17

readResolve peut être utilisé pour changer les données qui sont sérialisées par la méthode readObject. Par exemple, L'API xstream utilise cette fonctionnalité pour initialiser certains attributs qui n'étaient pas dans le XML à desérialiser.

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

9
répondu endless 2016-09-01 12:01:09

readResolve est pour quand vous pourriez avoir besoin de retourner un objet existant, par exemple parce que vous vérifiez les entrées en duplicata qui devraient être fusionnées, ou (par exemple dans les systèmes distribués éventuellement cohérents) parce que c'est une mise à jour qui peut arriver avant que vous n'ayez connaissance de versions plus anciennes.

5
répondu user833771 2014-06-27 19:47:07

readResolve () assurera le contrat singleton pendant la sérialisation.

S'il vous plaît se référer

3
répondu Kanagavelu Sugumar 2012-11-07 06:05:18

lorsque la sérialisation est utilisée pour convertir un objet afin qu'il puisse être sauvegardé en Fichier, nous pouvons déclencher une méthode, readResolve(). La méthode est privée et est conservée dans la même classe dont l'objet est récupéré lors de la désérialisation. Il assure que, après la désérialisation, l'objet retourné est le même que a été sérialisé. C'est-à-dire, instanceSer.hashCode() == instanceDeSer.hashCode()

La méthode

readResolve () n'est pas une méthode statique. Après in.readObject() est appelé pendant la désérialisation il est juste s'assure que l'objet retourné est le même que celui qui a été sérialisé comme ci-dessous tandis que out.writeObject(instanceSer)

..
    ObjectOutput out = new ObjectOutputStream(new FileOutputStream("file1.ser"));
    out.writeObject(instanceSer);
    out.close();

de cette façon, il aide aussi dans singleton design pattern implémentation, parce que chaque fois la même instance est retournée.

public static ABCSingleton getInstance(){
    return ABCSingleton.instance; //instance is static 
}
1
répondu hi.nitish 2016-12-18 19:35:37

readObject () est une méthode existante de la classe ObjectInputStream .pendant la lecture objet au moment de la deserialization méthode readObject vérifier en interne si l'objet de classe qui est en cours de deserialized a la méthode readResolve ou non si la méthode readResolve existe, alors il invoquera la méthode readResolve et retournera la même instance.

ainsi l'intense de l'écriture readResolve méthode est une bonne pratique pour atteindre la conception pure singleton modèle où personne ne peut obtenir une autre instance en sérialisant/désérialisant.

1
répondu arjun kumar mehta 2017-08-15 13:19:15

La readResolve Méthode

pour les classes sérialisables et Externalisables, la méthode readResolve permet à une classe de remplacer/résoudre l'objet lu à partir du flux avant qu'il ne soit retourné à l'appelant. En implémentant la méthode readResolve, une classe peut contrôler directement les types et les instances de ses propres instances étant désérialisées. La méthode est définie comme suit:

ANY-ACCESS-MODIFIER Object readResolve() lancers ObjectStreamException;

la méthode readResolve est appelée lorsque ObjectInputStream a lu un objet du flux et se prépare à le retourner à l'appelant. ObjectInputStream vérifie si la classe de l'objet définit la méthode readResolve. Si la méthode est définie, la readResolve méthode est appelée pour permettre l'objet dans le flux désigner l'objet doit être retourné. L'objet retourné doit être d'un type compatible avec tous les usages. S'il n'est pas compatible, un ClassCastException sera lancé lorsque l'inadéquation du type est découverte.

par exemple, une classe symbole peut être créée pour laquelle il n'existe qu'une seule instance de liaison de chaque symbole à l'intérieur d'une machine virtuelle. La méthode readResolve serait mise en œuvre pour déterminez si ce symbole était déjà défini et remplacez l'objet de symbole équivalent préexistant pour maintenir la contrainte d'identité. De cette façon, l'unicité des objets symboliques peut être maintenue à travers la sérialisation.

0
répondu Ankush soni 2016-01-28 04:15:18