反序列化对象是否保留静态值?

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对象,但我不知道.

And*_*ter 6

反序列化对象如何获得正确的静态字段值?

因为序列化和反序列化之间的静态字段值没有改变:

您正在同一个应用程序中运行测试.因此,静态类成员保留其值.类iteself不会重新加载或重新初始化 - 它仍然是相同的.

您应该在两个单独的应用程序中分开测试:

  • 让一个应用程序序列化该对象
  • 让一个应用程序反序列化该对象

然后一个接一个地运行这两个应用程序.然后,您将看到第二个应用程序中未恢复静态成员.

或者,在上面的代码中,您还可以在反序列化之前将静态字段设置为不同的值 - 然后您将看到变量在反序列化后仍具有此值.

从侧面说明,永远不要... catch(IOException e) {} ...- 至少打印堆栈跟踪e.printStackTrace().