【发布时间】:2013-02-12 20:48:19
【问题描述】:
我有一个四叉树*,我想在多台不同的机器上使用它。调用构造函数(即构建树)需要很长时间。我不想每次需要使用时都构建树。
我正在寻找一种方法将我的树保存在硬盘中,将其发送到每个节点,然后快速将其加载到内存中以便我可以执行查找。
序列化可以帮我解决这个问题吗?我知道我可以序列化树,将其保存到磁盘然后反序列化(这就是我对序列化的所有了解)。据我所知,反序列化步骤需要一个默认构造函数来构建树。由于构建树的计算成本很高,所以这对我没有用。
有没有什么方法可以导入持久化树而不必每次都重新构建它?
*我使用的四叉树基本代码:https://bitbucket.org/utcompling/textgrounder/src/f38150c7f33a/src/main/java/ags/utils/KdTree.java
抱歉,如果这太基本了,它与以下密切相关:https://stackoverflow.com/questions/14701245/how-do-i-perform-kd-tree-lookups-in-hadoop
edit:因此,看起来继承最少的类的无参数构造函数就是将被调用的构造函数。这是我的职位:
抽象 KDTree
QuadTree 扩展 KdTree
SpecialQuadTree(有一个 QuadTree 实例)
现在,我只能在使所有内容都可序列化时才能序列化 SpecialQuadTree(否则我会得到 NotSerizable 或 InvalidClassException 没有有效的构造函数):
抽象 KDTree 实现可序列化
QuadTree 扩展 KdTree 实现 Serializable
SpecialQuadTree 实现 Serializable(有一个 QuadTree 实例)
所以,我想我可以将 Serializable 从 KdTree 中取出,然后给它一个不做任何事情的无参数构造函数?这不容易,我没有写,也不懂KdTree类。我想我可以对它进行子类化,给子类一个不做任何事情的无参数构造函数,并从中继承 QuadTree...
edit:好的,我有一个抽象类 abstract KDTree 实现 Serializable
我由此扩展: QuadTree 扩展 KdTree 实现 Serializable
根据我所有的实验,我需要在两者上实现 Serializable。现在,
public QuadTree() {
super(2, 1000000);
System.out.println("QuadTree no-args!");
}
和
protected KdTree(int dimensions, Integer sizeLimit) {
System.out.println("KdTree, constructor!");
因为我从来没有看到它打印出来(除了最初的构造......),我想这一切都很好。
【问题讨论】:
-
你认为序列化和反序列化会比使用标准化的序列化方法(例如 XML/JSON)更有效吗?
-
过去,我一直使用 JSON 来持久化对象。我现在遇到的问题是我不知道如何编写将我的对象转换为 JSON 的方法。
-
我建议看看 Google Protocol buf
-
@kabram 有趣的建议。我会仔细看看的。还有更具体的提示吗?
-
应该有大量的 XML 和 JSON 编组(您所指的过程)往返于 JAVA。例如JAXB:en.wikipedia.org/wiki/JAXB
标签: java serialization