静态类变量和序列化/反序列化(static class variables and serializ

2019-08-02 14:54发布

从6 SCJP学习指南 - 有询问关于序列化下面的代码的输出问题:

import java.io.*;

public class TestClass {
  static public void main(String[] args) {
    SpecialSerial s = new SpecialSerial();
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myFile"));
        os.writeObject(s);
        os.close();
        System.out.print(++s.z + " ");
        s = null;  // makes no difference whether this is here or not

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("myFile"));
        SpecialSerial s2 = (SpecialSerial)is.readObject();
        is.close();
        System.out.println(s2.y + " " + s2.z);
    } catch (Exception e) {e.printStackTrace();}
  }
}
class SpecialSerial implements Serializable {
    transient int y = 7;
    static int z = 9;
}

这样做的输出为:10 0 10

为此给出的理由是,静态变量Z不是连载,我也没有想到它是。

对象已经被写入到文件后,在的println()语句静态int变量z的值被递增到10。

既然如此,为什么不回要么是在类被反序列化的9原值,或不能以正常方式被创建的类,类默认整型值0,而不是保持与它的非反序列化后-Default 10递增的值? 我本来以为是10的值会丢失,但这种情况并非如此。

任何人一些启发? 我跌跌撞撞在这里在黑暗中磕碰在这一个我的脚趾..

Answer 1:

基本上,实例是序列化,而不是类。 由类声明的静态域是由类的一个实例的串行/解串不受影响。 对于z被重置为9时, SpecialSerial类将需要重新加载 ,这是一个不同的问题。



Answer 2:

s2.z是一个静态成员的值zSpecialSerial类,这就是为什么它停留10 z是由类来限制,而不是实例。

这是因为如果你这样做

++SpecialSerial.z
System.out.println(SpecialSerial.z)

代替

++s.z
System.out.println(s2.z)


文章来源: static class variables and serialization / deserialization