java - 使用 writeUnshared() 序列化期间创建的对象数量

标签 java serialization io

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

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

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

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

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

提前致谢。

最佳答案

Nimbers of objects created during serialization ...

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

therefore 3 objects have been created.

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

However the final value of secCounter, which is an instance variable so can be serialized, is 1 instead of 3.

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

1 is the number of time I called the new keyword, So I supposed the constructor gets handled in a different way when an object is created with obi.writeUnshared()

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

关于java - 使用 writeUnshared() 序列化期间创建的对象数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031204/

相关文章:

c# - 在 C# 中,我无法将 XML 反序列化为对象

websocket - Socket.IO 连接上的无限循环

python - 程序文件目录中的 IO

java - ArrayList<HashMap<String,String>> 按字母顺序排列

java - 我没有得到列名

java - 列表中每个对象的表单 - ThymeLeaf

C++ json反序列化器

java - 反序列化 Java 对象时引用现有数据?

java - Java Swing 应用程序中的文本文档编辑器

c++ - 为什么这个 C++ 字符串连接缺少一个空格?