Est-il possible d'avoir final transient
les champs qui prennent une valeur autre que la valeur par défaut après la sérialisation en Java ? Mon cas d'utilisation est une variable de cache - c'est pourquoi il s'agit d'une valeur par défaut. transient
. J'ai aussi l'habitude de faire Map
les champs qui ne seront pas modifiés (c'est-à-dire que le contenu de la carte est modifié, mais l'objet lui-même reste le même) final
. Cependant, ces attributs semblent être contradictoires - alors que le compilateur permet une telle combinaison, je ne peux pas faire en sorte que le champ soit défini sur autre chose que null
après la désérialisation.
J'ai essayé ce qui suit, sans succès :
- initialisation simple des champs (montrée dans l'exemple) : c'est ce que je fais normalement, mais l'initialisation ne semble pas se produire après la désérialisation ;
- initialisation dans le constructeur (je crois que c'est sémantiquement la même chose que ci-dessus) ;
- l'attribution du champ dans
readObject()
- ne peut pas être fait puisque le champ estfinal
.
Dans l'exemple cache
es public
uniquement pour les tests.
import java.io.*;
import java.util.*;
public class test
{
public static void main (String[] args) throws Exception
{
X x = new X ();
System.out.println (x + " " + x.cache);
ByteArrayOutputStream buffer = new ByteArrayOutputStream ();
new ObjectOutputStream (buffer).writeObject (x);
x = (X) new ObjectInputStream (new ByteArrayInputStream (buffer.toByteArray ())).readObject ();
System.out.println (x + " " + x.cache);
}
public static class X implements Serializable
{
public final transient Map <Object, Object> cache = new HashMap <Object, Object> ();
}
}
Sortie :
test$X@1a46e30 {}
test$X@190d11 null