【问题标题】:java multiple deserialization of the same objectjava对同一个对象的多次反序列化
【发布时间】:2013-02-05 15:54:57
【问题描述】:

我有一个关于 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

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

【问题讨论】:

  • 是的,是的。反序列化意味着您将基于序列化数据创建一个对象,因此它必须是一个新实例。此外,如果您反序列化数据并生成具有相同地址位置的相同对象(从而产生内存泄漏),那将是非常糟糕

标签: java serialization deserialization


【解决方案1】:

是的,反序列化会为您的对象创建一个新实例,反序列化多次会创建多个实例 - 除非您覆盖反序列化方法并实现某种池化,请参见 here 示例

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2012-11-27
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多