假设我们有一个由节点和指针表示的任意图,如下所示:
class Node
{
public ValueType data;
public ArrayList<Node> adj;
}
现在,我想获取它的副本或在磁盘上写入/读取它(也称为序列化/反序列化)。我也知道可以使用搜索算法+关联数组来完成。并且,原来这个方法叫做swizzling .
这是我的问题:
我听说,在 Java 中,通过将类声明为可序列化,就会自动为您提供此功能。 (这对我来说就像一个魔法!)
这个说法正确吗? Java 是否自动运行 BFS 来遍历图形并混合指针?换句话说,序列化/反序列化是否会为我克隆对象? (一个完全全新的对象,具有相同的结构,但有新的节点和更新的指针)
如果是,那么在某些情况下我只想复制指针怎么办?如果我想序列化对象只是为了保留原始指针怎么办?
我很感谢对此的任何评论。 :-)
最佳答案
我先回答你的最后一个问题。序列化的目的不是在内存中克隆对象图。它将对象图转换为字节流,以便执行诸如保存在文件中或通过网络发送之类的操作。反序列化过程可能在不同的计算机上、在不同的时间、在不同的进程中甚至由非 Java 程序完成,因此获取对与以前相同的对象的引用并不是合理的期望。正在保存并稍后恢复的是对象图的结构和内容,而不是内存中的地址。正是由于这个原因,所有对象都可序列化是没有意义的。例如,序列化Thread
不会有用,因为它在程序的当前实例之外没有任何意义。
自动序列化背后的魔力并不是很复杂。忽略您可以为自己的类编写的自定义序列化方法以精确控制序列化和反序列化行为,是的,系统将有效地遍历对象图以生成字节流。这种遍历通常是通过 DFS 完成的,而不是 BFS 完成的。基本上,您要求 Java 序列化一个对象,并传递对其的引用。该引用将作为对象图的根。从那里,Java 将递归地序列化该对象的字段。当然,它确实跟踪循环引用并在输出流中写出适当的标记,以便解串器能够连接指针并重新创建以前的结构。
关于java - Java 自动指针调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492127/