2011-07-06 2 views
4

Lorsque j'ai une classe parente immuable A qui n'est PAS finale et qu'une autre classe B l'étend (B est mutable), l'immutabilité de A peut-elle être affectée par la sérialisation?Java: Immuabilité et sérialisation

J'ai écrit un petit programme pour sérialiser un objet, changé son état dans le programme, puis dé-sérialisé. J'ai récupéré l'objet sous la forme dans laquelle il était sérialisé. Je me demande donc s'il y a moyen de modifier l'immuabilité de A en la sérialisant?

Répondre

5

Cela dépend exactement de ce que vous demandez. Si vous voulez juste récupérer une valeur différente de celle que vous avez ajoutée, alors oui, vous pouvez le faire grâce à la sérialisation. Les données sérialisées sont complètement détachées de l'instance de A qui existe en mémoire. Lorsque Java reconstruit un objet à partir des données sérialisées, il ne sait rien de l'instance d'origine A utilisée pour créer ces données. Il s'agit simplement de construire une structure de données en mémoire basée sur le plan fourni dans l'information sérialisée. Par conséquent, si vous souhaitez modifier ce que vous obtenez lorsque vous reconstruisez A, vous pouvez le faire en modifiant manuellement les données sérialisées binaires. Cela nécessitera une bonne compréhension du format de sérialisation de Java, mais cela peut certainement être fait. Bien que si vous demandez s'il existe un moyen de modifier l'instance originale de A via la sérialisation (comme dans, pour obtenir le même objet pour changer de valeur, sans construire une nouvelle instance via la désérialisation), alors la réponse est non, vous ne pouvez pas. La sérialisation crée simplement un instantané de l'état actuel de l'objet. La désérialisation crée une nouvelle instance d'objet complètement détachée de l'instance source. Donc, bien que vous puissiez changer manuellement la valeur, le nouvel objet avec la nouvelle valeur sera toujours immuable une fois qu'il a été désérialisé.

Et si vous demandez s'il existe un moyen de sérialiser une instance de classe immutable A puis de désérialiser les données comme quelque chose qui s'identifie comme une instance de classe A mais s'avère être mutable alors la réponse est également non. Les données sérialisées spécifient quelle classe d'objet est représentée, mais la définition de classe elle-même n'est pas sérialisée. Vous pouvez donc modifier la classe spécifiée pour sérialiser une instance de A, puis désérialiser une instance de la classe modifiable B, mais ce n'est pas la même chose que récupérer une instance mutable de A.

2

Vous ne pouvez pas modifier son immutabilité (la classe sera toujours immuable) mais vous pouvez modifier ses valeurs en éditant les informations sérialisées.

Vous pouvez également le modifier par réflexion, immuable n'est pas une sorte de protection magique, c'est juste de créer une classe sans mutateurs pour aider à la stabilité globale du programme. Bien que les variables devraient probablement être finales, ce n'est même pas nécessaire - pour être immuable, vous devez toujours retourner la même valeur pour toutes vos méthodes. De toute façon, si vous voulez étendre une classe immuable, vous voudrez probablement que votre extension soit également immuable - si ce n'est pas le cas, vous ne voulez pas vraiment étendre la classe, peut-être voulez-vous simplement l'encapsuler (existe-t-il une relation is-a ou a-a?)

0

Lorsque vous sérialisez un objet, celui-ci ne change pas s'il est immuable ou non.

Lorsque vous désérialisez un nouvel objet, il s'agit d'une reconstruction du premier objet en fonction des informations enregistrées et de la procédure de désérialisation.Par exemple, si vous avez une classe immuable et qu'un champ est transitoire, la copie désérialisée n'aura pas ce champ défini (vous l'avez rendu transitoire)