2012-11-11 18 views
7

Z kursie SCJP 6 - jest pytanie z prośbą o wyjście z następującym kodem dotyczące serializacji:zmienne klasy statyczne i serializacji/deserializacji

import java.io.*; 

public class TestClass { 
    static public void main(String[] args) { 
    SpecialSerial s = new SpecialSerial(); 
    try { 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myFile")); 
     os.writeObject(s); 
     os.close(); 
     System.out.print(++s.z + " "); 
     s = null; // makes no difference whether this is here or not 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("myFile")); 
     SpecialSerial s2 = (SpecialSerial)is.readObject(); 
     is.close(); 
     System.out.println(s2.y + " " + s2.z); 
    } catch (Exception e) {e.printStackTrace();} 
    } 
} 
class SpecialSerial implements Serializable { 
    transient int y = 7; 
    static int z = 9; 
} 

Wyjście to jest: 10 0 10

Powodem tego jest to, że zmienna statyczna z nie jest serializowana, czego bym się nie spodziewał.

Wartość statycznej zmiennej int z jest zwiększana do 10 po zapisaniu obiektu do pliku, w instrukcji println().

W związku z tym, dlaczego nie jest ona przywrócona do pierwotnej wartości 9, gdy klasa jest deserialized, lub jako klasa nie jest tworzona w normalny sposób, domyślna wartość int klasy 0, zamiast pozostało z jego domyślną inkrementowaną wartością 10 po deserializacji? Sądziłbym, że wartość 10 jest stracona, ale tak nie jest.

Ktoś rzucił trochę światła? Potykam się tutaj po ciemku, zaciskając palce u nóg na tym ..

Odpowiedz

3

Zasadniczo instancje są serializowane, a nie klas. Żadne statyczne pola zadeklarowane przez klasę nie mają wpływu na serializację/deserializację instancji klasy. Aby ustawić z na 9, klasa SpecialSerial musiałaby być reloaded, co jest inną sprawą.

+0

Aaahh .. Ach tak, oczywiście - klasa sama w sobie pozostaje ładowany nawet jeśli nie istnieją przypadki niego. O tak, więc teraz ma to sens. Wielkie dzięki! :-) –

2

Wartość s2.z jest wartością statyczną członka z z SpecialSerial klasy, dlatego pozostaje on 10. z jest ograniczony przez klasę, a nie instancję.

To tak jakby zrobiłeś to

++SpecialSerial.z 
System.out.println(SpecialSerial.z) 

zamiast

++s.z 
System.out.println(s2.z) 
+0

Fajnie - dzięki. Teraz ma sens. :-) –