静态类变量和序列化/反序列化

时间:2012-11-11 23:46:17

标签: java serialization static deserialization

从SCJP 6学习指南 - 有一个问题要求输出以下关于序列化的代码:

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()语句中将对象写入文件后,static int变量z的值增加到10。

在这种情况下,为什么在反序列化时不返回它的原始值9,或者没有以正常方式创建类,类默认int值为0,而不是剩余反序列化后,它的非默认递增值为10?我原本以为10的价值会丢失,但事实并非如此。

任何人都有所了解?我在黑暗中磕磕绊绊地盯着我的脚趾。

2 个答案:

答案 0 :(得分:3)

基本上,实例是序列化的,而不是类。该类声明的任何静态字段不受该类实例的序列化/反序列化的影响。要将z重置为9SpecialSerial类必须为reloaded,这是另一回事。

答案 1 :(得分:2)

s2.z的值是z类的静态成员SpecialSerial的值,这就是它保持为10的原因。z受到类的限制,而不是实例。

就好像你已经完成了这个

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

而不是

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