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 ..
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! :-) –