Vic*_*Vic 6 java serialization
这是一个非常基本的测试程序:
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) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么它的输出是:
Result: 5 & -1
Result: 5 & -1
Run Code Online (Sandbox Code Playgroud)
由于静态成员未被序列化,因此获得默认值,我期待另一个输出:
Result: 5 & -1
Result: 0 & -1
Run Code Online (Sandbox Code Playgroud)
反序列化对象如何获得正确的静态字段值?
我已经制作了这个测试应用程序,因为我需要序列化一些带有许多静态字段的对象以进行深层复制(当然,我需要确保副本具有相同的静态字段值,因为它们被使用作为数组索引).
现在我对反序列化后发生的事情感到困惑.一方面,静态成员不会被序列化,但另一方面,如示例所示,静态成员以某种方式保留它们的值.我怀疑它是与铸造readObject()的Body对象,但我不知道.
反序列化对象如何获得正确的静态字段值?
因为序列化和反序列化之间的静态字段值没有改变:
您正在同一个应用程序中运行测试.因此,静态类成员保留其值.类iteself不会重新加载或重新初始化 - 它仍然是相同的.
您应该在两个单独的应用程序中分开测试:
然后一个接一个地运行这两个应用程序.然后,您将看到第二个应用程序中未恢复静态成员.
或者,在上面的代码中,您还可以在反序列化之前将静态字段设置为不同的值 - 然后您将看到变量在反序列化后仍具有此值.
从侧面说明,永远不要... catch(IOException e) {} ...- 至少打印堆栈跟踪e.printStackTrace().
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |