Java序列化 - 将对象写入文件后修改的对象

时间:2016-08-25 10:37:36

标签: java serialization deserialization

以下是我的示例代码:

public class Hybrid {
public static void main(String[] args) {
    Cultivate cultivate1 = new Cultivate();
    try{
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myfile"));
        os.writeObject(cultivate1);
        os.close();

        System.out.println("line 1 : "+ ++cultivate1.z+" ");

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("myfile"));
        Cultivate cultivate2 = (Cultivate)is.readObject();
        is.close();

        System.out.println("line 2 : "+cultivate1.y+" "+cultivate2.z);

    } catch(Exception x){
        System.out.println("exc");
    }
}
}
class Cultivate implements Serializable{
    transient int y=3;
    static int z = 6;
}

这是输出:

line 1 : 7 
line 2 : 3 7

有人可以解释为什么cultivate2.z打印7? 在关闭输出流之后,cultivate1.z的值会递增。那么这种修改如何反映在去贬值上呢?

2 个答案:

答案 0 :(得分:2)

z是一个静态字段,即它是一个类级别字段,而不是特定于实例的字段。

静态变量属于一个类,而不属于任何单个实例。序列化的概念与对象的当前状态有关。只序列化与类的特定实例关联的数据,因此在序列化期间将忽略静态成员字段。

因此,在反序列化期间,将从类中加载静态变量值的值。

答案 1 :(得分:2)

静态变量未被序列化,因此在反序列化期间,静态变量值将从类中加载。(将加载当前值。)

来自 ObjectOutputStream 的JavaDoc:

  

对象的默认序列化机制会写入对象的类,类签名以及所有非瞬态和非静态字段的值。对其他对象的引用(瞬态或静态字段除外)也会导致写入这些对象。使用引用共享机制对单个对象的多个引用进行编码,以便可以将对象图形恢复为与写入原始图像时相同的形状。