0

为了准备OCPJP7考试,我最近玩了一些Serialization。因此,我尝试序列化以下类:

class TempClass  implements Serializable {  
        int secCounter;   
        static int counter;  
        {  
                counter++;  
        }  
        {  
        secCounter=counter;  

然后当我尝试使用以下内容将对象写入 aFileOutputStream时:

TempClass temp = new TempClass();  
ObjectOutputStream obi = new ObjectOutputStream(new FileOutputStream(file));   
obi.writeObject(temp);  
obi.writeUnshared(temp);  
obi.writeUnshared(temp);  

因此,当我用 读回它们时,在这里我得到了 3 个不同的对象ObjectInputStream,因此创建了 3 个对象。secCounter然而,作为实例变量,因此可以序列化的最终值是 1 而不是 3。1 是我调用new关键字的次数,所以我认为构造函数在创建对象时以不同的方式处理obi.writeUnshared(object). 有人知道到底发生了什么吗?我知道静态变量没有序列化,但是在上面发布的代码中,我将值从静态变量复制到了实例变量secCounter。因此,最终再次检查secCounter成功序列化的值不会让我得到预期的(至少对我而言)结果,而是 1。

提前致谢。

4

2 回答 2

2

在序列化过程中创建的对象数量...

出于此问题的目的,在序列化期间创建了零个对象。

因此创建了 3 个对象。

writeUnshared() 不会创建任何对象。反序列化时创建对象

然而 secCounter 的最终值是 1 而不是 3,它是一个实例变量,因此可以被序列化。

证明了这一点。序列化时不创建对象。

1 是我调用 new 关键字的次数,所以我认为当使用obi.writeUnshared() 创建对象时,构造函数会以不同的方式处理

再一次,此方法不会创建任何对象。没有调用构造函数。writeUnshared ()中没有发生的是将“句柄”序列化为现有的序列化对象。现在的对象是序列化的,而不是作为对先前反序列化实例的引用而反序列化的句柄。

于 2013-08-03T09:36:40.107 回答
0

在反序列化构造函数(或初始化程序,如您的情况)期间不执行,这是因为当您反序列化对象时,您很可能期望对象的内部状态与原始对象的状态相同。运行初始化程序或构造函数可能会产生“副作用”,例如修改对象的内部状态。

于 2013-08-03T09:24:38.263 回答