Java:我可以在不调用构造函数的情况下反序列化对象吗?

时间:2013-02-12 20:48:20

标签: java serialization

我有一个四叉树*,我想在几台不同的机器上使用它。调用构造函数(即构建树)需要很长时间。每次我需要使用它时,我都不想构建树。

我正在寻找一种方法将我的树保存在硬盘中,将其发送到每个节点,然后快速将其加载到内存中,以便我可以执行查找。

序列化可以帮助我吗?我知道我可以序列化树,将其保存到磁盘然后反序列化(这是关于序列化的全部知识)。据我所知,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实例)

现在,我只能在编写所有Seri​​alizable时序列化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!");

因为我从来没有看到它打印出来(除了最初的构造...),我想这一切都很好。

3 个答案:

答案 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,那么如何使用自定义反序列化程序并附加到您尝试反序列化的类中?