【问题标题】:static class variables and serialization / deserialization静态类变量和序列化/反序列化
【发布时间】:2012-10-31 11:08:36
【问题描述】:

来自 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() 语句中,静态 int 变量 z 的值增加到 10。

既然如此,为什么在反序列化类时它没有恢复到原始值9,或者由于没有以正常方式创建类,类默认int值0,而不是保留反序列化后它的非默认增量值为 10?我原以为它是 10 的值会丢失,但事实并非如此。

有没有人解释一下?我在黑暗中跌跌撞撞地在这附近磕磕绊绊..

【问题讨论】:

    标签: java serialization static deserialization


    【解决方案1】:

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

    【讨论】:

    • Aaahh.. 是的,当然——即使没有实例,类本身也会保持加载状态。哦,是的 - 所以现在它很有意义。非常感谢! :-)
    【解决方案2】:

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

    好像你已经这样做了

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

    而不是

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

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2018-08-08
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 2010-11-20
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多