当前位置: 首页 > 知识库问答 >
问题:

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

龙俊美
2023-03-14

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

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

序列化能帮助我吗?我知道我可以序列化树,把它保存到磁盘上,然后反序列化(这就是我对序列化的全部了解)。据我所知,反序列化步骤需要一个默认的构造函数来构建树。因为构建树的计算成本很高,所以这对我没有用。

是否有一些方法可以导入持久化的树,而不必每次都重建它?

*我使用的四叉树基代码: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:看来继承最少的类的no-arg构造函数就是将被调用的构造函数。这是我的hirearchy:

抽象KDTree

四叉树扩展了KdTree

SpecialQuadTree(有一个QuadTree实例)

现在,我只能在使所有内容都可序列化时序列化SpecialQuadTree(否则我将获得NotSerializable或InvalidClassException无有效构造函数):

抽象KDTree实现了可序列化

QuadTree扩展KdTree实现可序列化

SpecialQuadTree实现可序列化(有一个QuadTree实例

所以,我想我可以从KdTree中去掉Serializable,然后给它一个donothing-no-args构造函数?这并不容易,我没有写,也不理解KdTree类。我想我可以对它进行子类化,给子类一个不做任何事情的args构造函数,然后从中继承四叉树。。。

编辑:好的,我有一个抽象类抽象KDTree实现序列化

然后我扩展了:四叉树扩展了KdTree实现了可序列化

根据我所有的实验,我需要在这两个平台上实现Serializable。现在

public QuadTree() {
    super(2, 1000000);
    System.out.println("QuadTree no-args!");
}

protected KdTree(int dimensions, Integer sizeLimit) {
    System.out.println("KdTree, constructor!");

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

共有3个答案

都才俊
2023-03-14

如果你在使用自定义的反序列化程序,那么你应该如何使用自定义的反序列化程序呢?

封俊艾
2023-03-14

据我所知,反序列化步骤需要一个默认构造函数来构建树

如果你正在学习Java对象序列化,它就不会。

看起来继承最少的类的无参数构造函数就是将被调用的构造函数。

否。将调用最近的不可序列化基类的无参数构造函数。

我想我可以从KdTree中去掉Serializable,然后给它一个donothing-no-args构造函数?

为什么?别管它。

祁凯泽
2023-03-14

当一个对象在Java中被反序列化时,只调用一些无参数构造函数(参见本文)。

最简单的方法是使所有涉及的类可序列化。那么就不会调用任何构造函数。如果您不能这样做,请确保您的Serializable类可以访问第一个非Serializable类的no-args构造函数。

对于您控制的不可序列化的基类,您可以将昂贵的逻辑移动到另一个构造函数(比如,使用一个伪布尔参数),并提供一个简单的不做任何操作的无参数构造函数。然后,在反序列化之后,所有字段都会出现,而不需要计算开销。

信息的最终来源是序列化规范。

 类似资料:
  • 问题内容: 我想使用com.fasterxml.jackson.databind.ObjectMapper序列化和反序列化不可变对象。 不可变类如下所示(只有3个内部属性,获取器和构造函数): 但是,当我运行此单元测试时: 我得到这个例外: 这个异常要求我创建一个默认的构造函数,但这是一个不可变的对象,所以我不想拥有它。它将如何设置内部属性?这会完全混淆API的用户。 所以我的问题是: 我可以在没

  • 我有一个类,它有一个默认构造函数,还有一个重载构造函数,它接受一组参数。这些参数与对象上的字段匹配,并在构造时指定。此时,我需要用于其他目的的默认构造函数,因此如果可以的话,我希望保留它。 我的问题:如果我删除默认的构造函数并传递JSON字符串,对象反序列化正确,并传递构造函数参数没有任何问题。我最终以我所期望的方式找回填充的对象。但是,一旦我将默认构造函数添加到对象中,当我调用

  • 我使用了Spring Boot 1.4.3。release和bean能够从JSON反序列化这样的对象。 升级到Spring Boot 2.0.0.M7后,我收到以下异常: 那么,为什么它在Spring Boot1.4.3中工作,而在Spring Boot2中失败呢?是否可以将bean配置为与旧版本相同的行为方式?

  • 如果一封邮件被发送到我的收件箱,我会收到一条消息,并将内容插入数据库。我有一个组织。springframework。整合。果心信息如下: 现在,如果出现故障,我希望有故障安全恢复机制,我想的是将消息对象序列化到一个文件中,然后反序列化并更新到DB。 问题1。在这种情况下,如何序列化消息对象?2。除了序列化,还可以使用其他机制吗? 编辑我以前没有做过序列化,我听说类应该实现Serializable,

  • 我想构造一个具有以下行为的对象: 我尝试了这个代码(对不起,我只有一部分,如果需要,我会尽快剩下的) 我对有问题,我不知道如何管理它。我有一些想法,但所有的想法都是关于一个一个地做,如果可能的话,我宁愿避免这样做

  • 我的问题是,有什么方法可以让我序列化/反序列化一个名为onlinePlayers的列表,该列表引用了“John1”的实例,它也碰巧在List allPlayers中,而不重复“John1”,同时仍然引用那个对象? 我猜当我反序列化allPlayers时,它将创建不同于原始对象的对象,所以onlinePlayers在反序列化后不可能仍然引用相同的对象。我是否应该编写一个自定义方法,在反序列化后将新创