反序列化后,我的全局变量值未被保留

时间:2013-12-19 22:04:44

标签: java serialization deserialization

我像这样序列化了一个名为GreenhouseControls的类:

public class GreenhouseControls extends Controller implements Serializable{

 ......

    public void saveState() {
          try{
              // Serialize data object to a file
              ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("dump.out"));
              out.writeObject(GreenhouseControls.this);
              System.out.println(GreenhouseControls.errorcode); // Prints 1
              out.close();
              } catch (IOException e) {
              }
      }

 ......

}

当GreenhouseControls对象被序列化时,全局静态变量'errorcode'被设置为1.

然后我按照以下方式反序列化了GreenhouseControls类:

public class GreenhouseControls extends Controller implements Serializable{

......

    public class Restore extends Event {

          .....

          @Override
          public void action()  { 
              try {

                  FileInputStream fis = new FileInputStream(eventsFile); 
                  ObjectInputStream ois = new ObjectInputStream(fis);  
                  GreenhouseControls gc = (GreenhouseControls) ois.readObject(); 
                  System.out.println("Saved errorcode: " + gc.errorcode); // Prints 0 (the default value)
                  ois.close();        
              }catch (IOException | ClassNotFoundException e) {
                  e.printStackTrace();
              } 
          }
      }

......

}

当我在反序列化后将'errorcode'打印到控制台时,我希望得到1值,而不是0,这是变量的默认值。反序列化后,静态变量的序列化值是否应该保留?

2 个答案:

答案 0 :(得分:5)

不,静态变量不是序列化的,因为它们独立于您要序列化的实例化对象而存在。

答案 1 :(得分:2)

要展开answer of Mattdefault Java serialization将序列化非瞬态和非静态变量。序列化的目的是能够从流中恢复对象的状态。由于静态变量不是该类的状态,而是系统的状态,因此它不是序列化的。

请注意,通过实施readObjectwriteObject方法来序列化静态是可能的,但可能并不明智。

Java™ Object Serialization specification比您可能关心的更详细地描述了这一点; - )