2011-01-27 12 views
16
public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 
    ... 
} 

¿Hay alguna manera para asegurar que cuando se deserializa un objeto de la clase por encima del myHash miembro se establecerá en un nuevo mapa vacío en lugar de establecerse en nulo?deserializar un miembro transitoria de un objeto a un valor predeterminado no nulo en Java

+0

¿Ya no está configurando los valores predeterminados? ¿Es esta una clase singleton? – fmucar

+3

@fatih La deserialización no llama a sus constructores ni a sus inicializadores de campo. Es una lección importante, puede ahorrarte horas de depuración de problemas aparentemente un buen código que de repente deja de funcionar. – biziclop

+1

no llamará a ninguna función o constructor, pero aparentemente no está ejecutando inits de objeto entrado de clase inits también. aprendiendo cosas nuevas todos los días Gracias. – fmucar

Respuesta

28
public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     in.defaultReadObject(); 

     myHash = new HashMap<String, Object>(); 
    } 
} 
+0

Una pequeña explicación para ir con el código mejoraría su respuesta. ¡Las respuestas solo de código solo tienen sentido para aquellos que ya saben lo que están haciendo! – Robino

2

Usted puede implementar su propio método personalizado readIn y crear explícitamente un nuevo Map<T> como se explica en el Java Serializable documentation. Ese artículo debería describir cómo hacer lo que estás buscando; verifique la sección titulada Personalice el protocolo predeterminado.

+0

Ese enlace está muerto. – Robino

8

¿Qué pasa con la adición de un método readObject así:

public class MyObj implements Serializable { 
    private transient Map<String, Object> myHash = new HashMap<String, Object>(); 
    ... 
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
    in.defaultReadObject();  
    myHash = new HashMap<String, Object>(); 
    } 
} 

Eso debería ayudará con estas cosas.

Cuestiones relacionadas