处理这个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),我如何保持对象之间的关系?
如果客户端发送'线性'树,则可以接受在此简短示例中执行的(反)序列化。
答案 0 :(得分:2)
对branch_1_1 branch_1_2进行反序列化后,我发现关系丢失了,并且创建了两个与branch_1和root对应的MyTree新实例。
当你拍摄这些物品的副本时会发生这种情况。它们与原始对象没有任何关系。
如果客户端发送关系中的两个对象(如branch_1_1和branch_1_2),我如何保持对象之间的关系?
如果您不希望其副本最终成为独立对象,请不要自行发送分支。
您应序列化整个树,然后保留所有关系,因为您正在复制整个树。
MyTree new_root = serializeAndDeserialize(root);
现在您拥有了root
树的副本,其中包含所有关系。