2

いくつかの異なるマシンで使用したいクワッドツリー*があります。コンストラクターの呼び出し(つまり、ツリーの構築)には長い時間がかかります。使用するたびにツリーを構築したくありません。

ツリーをハードディスクに永続化し、それを各ノードに送信してから、ルックアップを実行できるようにメモリにすばやくロードする方法を探しています。

シリアル化はこれに役立ちますか?ツリーをシリアル化し、ディスクに保存してから逆シリアル化できることを知っています(シリアル化について知っていることはこれだけです)。私の知る限り、脱セリル化ステップには、ツリーを構築するためのデフォルトのコンストラクターが必要です。ツリーの構築には計算コストがかかるため、これは私には役に立ちません。

永続化されたツリーを毎回再構築せずにインポートできる方法はありますか?

*使用したクワッドツリーのベースコード: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のインスタンスがあります)

現在、SpecialQuadTreeをシリアル化できるのは、すべてをシリアル化可能にした場合のみです(そうでない場合、NotSerizableまたはInvalidClassExceptionに有効なコンストラクターがありません)。

抽象KDTreeはSerializableを実装します

QuadTreeはKdTreeを拡張してSerializableを実装します

SpecialQuadTreeはSerializableを実装します(QuadTreeのインスタンスがあります)

したがって、SerializableをKdTreeから削除して、何もしない引数なし​​のコンストラクターを指定できると思いますか?それは簡単ではありません。私はKdTreeクラスを記述せず、理解していませんでした。私はそれをサブクラス化し、サブクラスに何もしない引数のないコンストラクターを与え、そこからQuadTreeを継承できると思います...

編集:わかりました、私は抽象クラスを持っています抽象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!");

私はそれが印刷されるのを見たことがないので(最初の構造を除いて...)、それはすべて良いと思います。

4

3 に答える 3

3

オブジェクトが Java で逆シリアル化されると、引数のないコンストラクターの一部のみが呼び出されます (この投稿を参照)。

最も簡単な方法は、関連するすべてのクラスを作成することSerializableです。その後、コンストラクターは呼び出されません。それができない場合は、クラスが最初のシリアル化不可能なクラスの引数なしコンストラクターにアクセスできることを確認しSerializableください

制御下にある非Serializable基本クラスの場合、高価なロジックを別のコンストラクターに移動し (たとえば、仮boolean引数を使用して)、何もしない単純な引数なしのコンストラクターを提供できます。次に、計算オーバーヘッドなしで、逆シリアル化後にすべてのフィールドが存在します。

最終的な情報源はシリアライゼーション仕様です。

于 2013-02-12T20:58:48.007 に答える
2

私の知る限り、逆シリアル化ステップには、ツリーを構築するためのデフォルトのコンストラクターが必要です

Java オブジェクトのシリアライゼーションを扱っている場合はそうではありません。

最も継承されていないクラスの引数なしのコンストラクターが呼び出されるようです。

いいえ。最も近いシリアル化不可能な基本クラスの引数なしのコンストラクターが呼び出されます。

Serializable を KdTree から取り出して、何もしない引数なし​​のコンストラクターを与えることができると思いますか?

なんで?放っておいてください。

于 2013-02-12T20:56:54.957 に答える
0

Jackson を使用している場合、カスタム デシリアライザーを使用して、デシリアライズしようとしているクラスにアタッチするのはどうですか?

于 2014-11-24T19:15:51.060 に答える