2013-02-20 36 views
1

我對Java序列化的語義有個疑問:反序列化同一個對象兩次實際上是在內存中創建兩個實例嗎?例如:同一對象的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 

該代碼似乎意味着答案是肯定的。我想知道這種行爲是否有意義?

+1

是,是的。反序列化意味着你將*創建一個基於序列化數據的對象,所以它必須是一個新實例。另外,如果反序列化數據並生成具有相同*地址位置的同一對象(從而產生內存泄漏),它將*非常糟糕。 – 2013-02-20 15:20:08

回答

3

是,反序列化創建你的對象的新實例,和反序列化多次將創建多個實例 - 除非你重寫反序列化的方法和實施某種池,請參閱here例如