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

时间:2016-04-26 08:23:09

标签: 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) {
        }

    }
}

但我不明白为什么它的输出是:

Result: 5 & -1
Result: 5 & -1

由于静态成员未被序列化,因此获得默认值,我期待另一个输出:

Result: 5 & -1
Result: 0 & -1

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

我已经制作了这个测试应用程序,因为我需要序列化一些带有多个静态字段的对象才能制作深层副本(当然,我需要确保副本具有相同的静态字段&# 39;值,因为它们用作数组索引)。

现在我对反序列化后发生的事情感到非常困惑。一方面,静态成员不会被序列化,但另一方面,如示例所示,静态成员以某种方式保留其值。我怀疑这与将readObject()投射到Body对象有关,但我不确定。

1 个答案:

答案 0 :(得分:6)

  

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

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

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

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

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

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

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

在旁注中,永远不要... catch(IOException e) {} ... - 至少用e.printStackTrace()打印堆栈跟踪。