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

Czy istnieje jakiś sposób, aby zapewnić, że gdy przedmiotem powyższej klasie jest rozszeregować myHash członek zostanie ustawiony na nową pustą mapą zamiast ustawić na wartość null?deserializowania przemijające członek obiektu do wartości null domyślnie w Javie

+0

czy to nie jest ustawienie domyślnych wartości? czy to jest klasa singleton? – fmucar

+3

@fatih Deserializacja nie wywołuje konstruktorów ani inicjalizatorów pól. Jest to ważna lekcja, która może zaoszczędzić wiele godzin na kłopotliwym debugowaniu pozornie dobrego kodu, który nagle przestaje działać. – biziclop

+1

nie będzie wywoływać żadnych funkcji ani konstruktorów, ale w sposób apertyczny nie będzie wykonywał inicjałów obiektów wbudowanych w zakres klasy. uczenie się nowych rzeczy każdego dnia. dzięki. – fmucar

Odpowiedz

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

Trochę objaśnienia do kodu poprawi odpowiedź. Tylko kody odpowiedzi mają sens tylko dla tych, którzy już wiedzą, co robią! – Robino

2

można zaimplementować własną metodę zwyczaj readIn i jawnie utworzyć nowy Map<T> jak wyjaśniono w Java Serializable documentation. Ten artykuł powinien opisywać, jak robić to, czego szukasz; sprawdź sekcję o nazwie Dostosuj domyślny protokół.

+0

To łącze nie działa. – Robino

8

Co o dodanie metody readObject tak:

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

To powinno rozwiązać cię.

Powiązane problemy