我像这样序列化了一个名为GreenhouseControls的类:
public class GreenhouseControls extends Controller implements Serializable{
......
public void saveState() {
try{
// Serialize data object to a file
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("dump.out"));
out.writeObject(GreenhouseControls.this);
System.out.println(GreenhouseControls.errorcode); // Prints 1
out.close();
} catch (IOException e) {
}
}
......
}
当GreenhouseControls对象被序列化时,全局静态变量'errorcode'被设置为1.
然后我按照以下方式反序列化了GreenhouseControls类:
public class GreenhouseControls extends Controller implements Serializable{
......
public class Restore extends Event {
.....
@Override
public void action() {
try {
FileInputStream fis = new FileInputStream(eventsFile);
ObjectInputStream ois = new ObjectInputStream(fis);
GreenhouseControls gc = (GreenhouseControls) ois.readObject();
System.out.println("Saved errorcode: " + gc.errorcode); // Prints 0 (the default value)
ois.close();
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
......
}
当我在反序列化后将'errorcode'打印到控制台时,我希望得到1值,而不是0,这是变量的默认值。反序列化后,静态变量的序列化值是否应该保留?
答案 0 :(得分:5)
不,静态变量不是序列化的,因为它们独立于您要序列化的实例化对象而存在。
答案 1 :(得分:2)
要展开answer of Matt,default Java serialization将序列化非瞬态和非静态变量。序列化的目的是能够从流中恢复对象的状态。由于静态变量不是该类的状态,而是系统的状态,因此它不是序列化的。
请注意,通过实施readObject和writeObject方法来序列化静态是可能的,但可能并不明智。
Java™ Object Serialization specification比您可能关心的更详细地描述了这一点; - )