我有一个四叉树*,我想在几台不同的机器上使用它。调用构造函数(即构建树)需要很长时间。每次我需要使用它时,我都不想构建树。
我正在寻找一种方法将我的树保存在硬盘中,将其发送到每个节点,然后快速将其加载到内存中,以便我可以执行查找。
序列化可以帮助我吗?我知道我可以序列化树,将其保存到磁盘然后反序列化(这是关于序列化的全部知识)。据我所知,deserilization步骤需要一个默认构造函数来构建树。由于构建树的计算成本很高,这对我没用。
有没有什么方法可以导入持久树而不必每次都重建它?
*我使用的四叉树基本代码: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
密切相关编辑:因此,看起来最少继承的类的无参数构造函数将被调用。这是我的雇主:
摘要KDTree
QuadTree扩展了KdTree
SpecialQuadTree(有一个QuadTree实例)
现在,我只能在编写所有Serializable时序列化SpecialQuadTree(否则我得到NotSerizable或InvalidClassException没有有效的构造函数):
abstract KDTree实现Serializable
QuadTree扩展了KdTree实现Serializable
SpecialQuadTree实现Serializable(具有QuadTree实例)
所以,我想我可以将Serializable从KdTree中删除,然后给它一个do-nothing no-args构造函数?这并不容易,我没有写,也不理解KdTree课程。我想我可以继承它,给子类一个do-nothing no-args构造函数,并从那继承QuadTree ......
编辑:好的,我有一个抽象类 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!");
因为我从来没有看到它打印出来(除了最初的构造...),我想这一切都很好。
答案 0 :(得分:3)
在Java中反序列化对象时,只调用一些无参数构造函数(参见this post)。
最简单的方法是制作所有涉及的课程Serializable
。那么你的构造函数都不会被调用。如果您不能这样做,请确保您的Serializable
班级have access to the no-args constructor of the first non-Serializable class。
如果非Serializable
基类在您的控制之下,您可以将昂贵的逻辑移动到不同的构造函数(假设,使用虚拟boolean
参数)并提供一个简单的no-args构造函数什么都不做。然后,所有字段都将在反序列化之后存在,而不会产生计算开销。
最终的信息来源是the serialization spec。
答案 1 :(得分:2)
据我所知,deserilization步骤需要一个默认构造函数来构建树
如果您正在使用Java对象序列化,则不会。
看起来最少继承类的无参数构造函数是将要调用的类。
没有。调用最近的非可序列化基类的no-args构造函数。
我想我可以将Serializable从KdTree中删除,然后给它一个do-nothing no-args构造函数?
为什么呢?别管它。
答案 2 :(得分:0)
如果您正在使用Jackson,那么如何使用自定义反序列化程序并附加到您尝试反序列化的类中?