这是一个非常基本的测试程序:
public class Body implements Serializable {
static int bod = 5;
int dis = -1;
public void show(){
System.out.println("Result: " + bod + " & " + dis);
}
}
public class Testing {
public static void main(String[] args) {
Body theBody = new Body();
theBody.show();
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.dat"));
out.writeObject(theBody);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.dat"));
Body bodyDouble = (Body)in.readObject();
in.close();
bodyDouble.show();
} catch(IOException e) {
} catch(ClassNotFoundException e) {
}
}
}
但我不明白为什么它的输出是:
Result: 5 & -1
Result: 5 & -1
由于静态成员未被序列化,因此获得默认值,我期待另一个输出:
Result: 5 & -1
Result: 0 & -1
反序列化对象如何获取正确的静态字段值?
我已经制作了这个测试应用程序,因为我需要序列化一些带有多个静态字段的对象才能制作深层副本(当然,我需要确保副本具有相同的静态字段&# 39;值,因为它们用作数组索引)。
现在我对反序列化后发生的事情感到非常困惑。一方面,静态成员不会被序列化,但另一方面,如示例所示,静态成员以某种方式保留其值。我怀疑这与将readObject()
投射到Body
对象有关,但我不确定。
答案 0 :(得分:6)
反序列化对象如何获取正确的静态字段值?
因为序列化和反序列化之间的静态字段值没有改变:
您正在相同的应用程序中运行测试。因此,静态类成员保留其值。不重新加载或重新初始化类iteself - 它仍然是相同的。
您应该在两个单独的应用程序中分离您的测试:
然后一个接一个地运行这两个应用程序。然后,您将看到第二个应用程序中未恢复静态成员。
或者,在上面的代码中,您还可以在反序列化之前将静态字段设置为不同的值 - 然后您将看到在反序列化后变量仍具有此值。
在旁注中,永远不要... catch(IOException e) {} ...
- 至少用e.printStackTrace()
打印堆栈跟踪。