campos transitorios finales y serialización

¿Es posible tenerfinal transient campos que se establecen en cualquier valor no predeterminado después de la serialización en Java? Mi caso de uso es una variable de caché, por eso estransient. También tengo la costumbre de hacerMap campos que no se cambiarán (es decir, el contenido del mapa se cambia, pero el objeto en sí sigue siendo el mismo)final. Sin embargo, estos atributos parecen ser contradictorios: aunque el compilador permite tal combinación, no puedo tener el campo establecido en nada más quenull después de la deserialización.

Intenté lo siguiente, sin éxito:

inicialización de campo simple (que se muestra en el ejemplo): esto es lo que hago normalmente, pero la inicialización no parece ocurrir después de la deserialización;inicialización en constructor (aunque creo que esto es semánticamente igual que el anterior);asignando el campo enreadObject() - no se puede hacer ya que el campo esfinal.

En el ejemplocache espublic solo para pruebas.

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> ();
    }
}

Salida:

test$X@1a46e30 {}
test$X@190d11 null

Respuestas a la pregunta(5)

Su respuesta a la pregunta