反序列化后丢失对象的引用

Ale*_*sey 5 java

假设我有两个HashMaps:hashMapFoohashMapBar.

我创建了一些对象objCake并将put其创建到两个地图中,因此每个地图都有一个引用objCake,当我对从中objCake访问它的任何地图进行一些更改时,我得到了正确的对象状态.

在我序列化两个地图并反序列化之后,我遇到问题,我的对象objCake已成为两个不同的对象!我改变了状态hashMapFoo,但没有任何反应hashMapBar.hashMapBar不再包含正确的参考!所有地图和对象implement Serializable.

有人可以解释一下吗?

JB *_*zet 6

适合我:

public class MapSerializationTest {
    private static class Foo implements Serializable {
    }

    public static void main(String[] args) throws Exception {
        Foo foo = new Foo();

        Map<String, Foo> map1 = new HashMap<String, Foo>();
        map1.put("foo", foo);
        Map<String, Foo> map2 = new HashMap<String, Foo>();
        map2.put("foo", foo);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(map1);
        oos.writeObject(map2);
        oos.close();

        byte[] bytes = baos.toByteArray();

        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        map1 = (Map<String, Foo>) ois.readObject();
        map2 = (Map<String, Foo>) ois.readObject();
        System.out.println(map1.get("foo") == map2.get("foo")); // prints true
    }
}
Run Code Online (Sandbox Code Playgroud)

告诉我们你的代码.您可能会调用reset()第一个和第二个映射之间的ObjectOutputStream.或者您使用两个不同的ObjectOutputStream实例.