campos transitórios finais e serialização
É possível terfinal transient
campos definidos para qualquer valor não padrão após a serialização em Java? Meu caso de usuário é uma variável de cache - é por isso quetransient
. Eu também tenho o hábito de fazerMap
campos que não serão alterados (ou seja, o conteúdo do mapa é alterado, mas o próprio objeto permanece o mesmo)final
. No entanto, esses atributos parecem contraditórios - enquanto o compilador permite essa combinação, não posso ter o campo definido para nada além denull
após desserialização.
Eu tentei o seguinte, sem sucesso:
inicialização de campo simples (mostrada no exemplo): é o que eu normalmente faço, mas a inicialização não parece ocorrer após a desserialização;inicialização no construtor (acredito que isto é semanticamente o mesmo que acima);atribuindo o campo emreadObject()
- não pode ser feito, pois o campo éfinal
.No exemplocache
épublic
somente para teste.
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> ();
}
}
Resultado:
test$X@1a46e30 {}
test$X@190d11 null