在反序列化对象时保留实例树

时间:2016-03-24 18:00:28

标签: java serialization deserialization

处理这个java可序列化类

public class MyTree implements Serializable {
    private static final long serialVersionUID = 3857878156205663235L;
    public MyTree parent;
    public String name;

    public MyTree() {
        parent = null;
        name = "root";
    }

    public MyTree(MyTree p, String n) {
        parent = p;
        name = n;
    }
}

我在(de)序列化对象之前实例化了几个MyTree:

//                root
//                  |
//                branch_1
//                 /    \
//         branch_1_1   branch_1_2


    private static void mytree() throws ClassNotFoundException, IOException {
        MyTree root = new MyTree();

        MyTree branch_1 = new MyTree(root, "branch_1");
        MyTree branch_1_1 = new MyTree(branch_1, "branch_1_1");
        MyTree branch_1_2 = new MyTree(branch_1, "branch_1_2");

        System.out.println("parent branch 1_1 : " + branch_1_1.parent);
        System.out.println("parent branch 1_2 : " + branch_1_2.parent);

        System.out.println();
        System.out.println("Serialization");
        System.out.println();
        MyTree new_branch_1_1 = serializeAndDeserialize(branch_1_1);
        MyTree new_branch_1_2 = serializeAndDeserialize(branch_1_2);

        System.out.println("parent branch 1_1 : " + new_branch_1_1.parent);
        System.out.println("parent branch 1_2 : " + new_branch_1_2.parent);
    }

    public static <T> T serializeAndDeserialize(T o) throws IOException, ClassNotFoundException {
            // serialize the Object
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream so = new ObjectOutputStream(bos);
            so.writeObject(o);

            // deserialize the Object
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream si = new ObjectInputStream(bis);
            return (T)si.readObject();
    }

对branch_1_1 branch_1_2进行反序列化后,我发现关系丢失了,并且创建了两个与branch_1和root对应的MyTree新实例。

实际上,这些对象将在其他JVM中反序列化。 如果客户端发送关系中的两个对象(如branch_1_1和branch_1_2),我如何保持对象之间的关系?

如果客户端发送'线性'树,则可以接受在此简短示例中执行的(反)序列化。

1 个答案:

答案 0 :(得分:2)

  

对branch_1_1 branch_1_2进行反序列化后,我发现关系丢失了,并且创建了两个与branch_1和root对应的MyTree新实例。

当你拍摄这些物品的副本时会发生这种情况。它们与原始对象没有任何关系。

  

如果客户端发送关系中的两个对象(如branch_1_1和branch_1_2),我如何保持对象之间的关系?

如果您不希望其副本最终成为独立对象,请不要自行发送分支。

您应序列化整个树,然后保留所有关系,因为您正在复制整个树。

MyTree new_root = serializeAndDeserialize(root);

现在您拥有了root树的副本,其中包含所有关系。