用Java实现指针的自动滑动



假设我们有一个由节点和指针表示的任意图,如下所示:

class Node
{
    public ValueType data;
    public ArrayList<Node> adj;
}

现在,我想复制它或在磁盘上写入/读取它(又名序列化/反序列化)。我也知道它可以使用搜索算法+关联数组来完成。事实证明,这种方法被称为swizzling。

我的问题是:

我听说在Java中,通过将类声明为Serializable,可以自动为您提供此功能。(这听起来像魔术!)

这个说法正确吗?Java是否会自动运行BFS来遍历图形并摆动指针?换句话说,序列化/反序列化是否为我克隆了对象?(一个全新的对象,具有相同的结构,但有新的节点和更新的指针)

如果是,那么在某些情况下,如果我只想复制指针呢?如果我只想序列化对象以保留原始指针,该怎么办?

我很感激对此发表任何评论。:-)

我将首先回答您的最后一个问题。序列化的目的不是在内存中克隆对象图。它是将对象图转换为字节流,以便执行诸如保存在文件中或跨线发送之类的操作。反序列化过程可能在不同的计算机上、不同的时间、不同的过程中完成,甚至由非Java程序完成,因此不可能像以前那样获得对相同对象的引用。保存和稍后恢复的是对象图的结构和内容,而不是内存地址。正是由于这个原因,所有对象都可以序列化是没有意义的。例如,序列化Thread将没有用处,因为它在程序的当前实例之外没有意义。

自动序列化背后的魔力并不是很复杂。忽略可以为自己的类编写的自定义序列化方法来精确控制序列化和反序列化行为,是的,系统将有效地遍历对象图以生成字节流。这种遍历通常作为DFS而不是BFS来完成。基本上,您要求Java序列化一个对象,并向其传递一个引用。该引用将作为对象图的根。从那里开始,Java将递归地序列化该对象的字段。当然,它确实跟踪循环引用,并在输出流中写出适当的标记,这样反序列化器就可以挂接指针并像以前一样重新创建结构。

我不认为这是你的想法,但基本上是这样。Java中的序列化是一个相当不透明的过程。关于它,您真正需要知道的是,假设一个类及其所有成员类型实现Serializable,Java知道如何将其转换为字节流,以及当您要求它进行反序列化时,如何从该流中重新创建对象的实例。

它来自C++,一开始看起来确实像是黑魔法。我对整个过程有点怀疑,也不相信JVM会帮我处理它,因为在C++中,它对一个普通对象的了解不够。但假设您只需要访问Java中的数据,它实际上非常好。

基本上,不需要担心指针或它在下面使用的算法。你只需要告诉它写一个对象,然后再告诉它读回一个,你的内存结构基本上和以前完全一样。

还有一件事:如果您将一个变量声明为transient,它将不会被保存,您必须自己恢复它。如果您的字段缓存了某些不想浪费空间的值,或者字段中包含了敏感数据,您不想到处乱放,那么这将非常有用。但你必须记得自己修复它。

相关内容

  • 没有找到相关文章

最新更新