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

C'è un modo per garantire che quando un oggetto della classe di cui sopra è deserializzata la myHash membro sarà impostato un nuovo vuota mappa piuttosto che essere impostato su null?deserializzare un membro transitorio di un oggetto a un default non nullo in Java

+0

non sta già impostando i valori predefiniti? questa è una classe singleton? – fmucar

+3

@fatih La deserializzazione non chiama i tuoi costruttori o i tuoi inizializzatori di campo. È una lezione importante, può farti risparmiare ore di fastidioso debug di codice apparentemente buono che improvvisamente cessa di funzionare. – biziclop

+1

non chiamerà alcuna funzione o costruttore, ma in modo apprezzabile non sta eseguendo anche ined object inited object. imparare cose nuove ogni giorno. grazie. – fmucar

risposta

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 piccola spiegazione per andare con il codice potrebbe migliorare la risposta. Le risposte al solo codice hanno senso solo per coloro che sanno già cosa stanno facendo! – Robino

2

È possibile implementare il proprio metodo personalizzato readIn e creare esplicitamente un nuovo Map<T> come spiegato nella Java Serializable documentation. Quell'articolo dovrebbe descrivere come fare ciò che stai cercando; controllare la sezione Personalizza il protocollo predefinito.

+0

Questo link è morto. – Robino

8

Che dire l'aggiunta di un metodo readObject come questo:

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

Questo dovrebbe risolvere fuori.

Problemi correlati