java多次反序列化同一个对象

标签 java serialization deserialization

我有一个关于 Java 序列化语义的问题:反序列化同一个对象两次实际上会在内存中创建两个实例吗?例如:

    ByteArrayOutputStream ba = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(ba);

    LinkedListNode tail = new LinkedListNode(null);
    LinkedListNode n1 = new LinkedListNode(tail);

    oos.writeObject(n1);
    oos.flush();

    ByteArrayInputStream bi = new ByteArrayInputStream(ba.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bi);
    LinkedListNode r1 = (Node)ois.readObject();

    ByteArrayInputStream bi2 = new ByteArrayInputStream(ba.toByteArray());
    ObjectInputStream ois2 = new ObjectInputStream(bi2);
    LinkedListNode r2 = (Node)ois2.readObject();

    System.out.println("r1 == r2 " + (r1 == r2)); // prints false
    System.out.println("r1.next == r2.next " + (r1.next == r2.next)); // prints false

代码似乎暗示答案是肯定的。我想知道这种行为是否有意义?

最佳答案

是的,反序列化会创建对象的一个​​新实例,多次反序列化将创建多个实例 - 除非您重写反序列化方法并实现某种池化,请参阅 here例如

关于java多次反序列化同一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14983390/

相关文章:

java - 使用 Jackson 将映射编码到对象

java - 如何在流布局中组织对象?

java - 使用 KeyBindings 获取输入

java - 在java中序列化/反序列化自定义链表的正确方法?

serialization - Clojure:存储和编译大型派生数据结构

c# - 如何将模型序列化为隐藏字段?

apache-kafka - Kafka AVRO - 从长到日期时间的转换

java - 在 Spring Data 中为同一 QueryDSL 路径创建多个别名

java - 为什么 InputStreamReader read() 阻塞而不是返回 -1?

c++ - 序列化 boost::unordered_set 时的编译错误