0

Hadoop で使用しようとしているサードパーティ クラスがあるため、それを実装する必要がありますWritable。問題は、Hadoop が使用する方法Writableが object を作成しo = SomeObject()、次に de-serialize を呼び出すo.readFields(in)ことであり、私の状況では空のオブジェクトを作成できないことです。

public abstract class Cube {
    protected final int size;
    protected Cube(int size) { this.size = size; }
}

注意事項sizeですfinal

public class RealCube {
    public Cube(int size) { super(size); }
}

ここRealCubeでは、呼び出すスーパー コンストラクターが 1 つだけあり、そのコンストラクターがfinal抽象スーパー クラスに変数を設定します。

public class RealCubeWritable implements Writable {
    public void readFields(DataInput in) {
        /* yikes! need to set the size */
    }
}

を実装しようとするとRealCubeWritable、コンストラクターを持つことができず、ストリームを調べるまでRealCubeWritable()実際のことを知ることができません。sizeDataInput

したがって、Hadoop でこれを行う唯一の方法はラッパーを使用することです。私が疑問に思っているのは、ラッパーを使用する方法があるかどうかですが、RealCubeWritableそれでも動作しRealCubeますか? 動的プロキシ クラスの使用を検討しましたが、これが機能するかどうか (または実際にどのように行うか) はわかりません。

ありがとう!

4

1 に答える 1

1

本当に Cube オブジェクトを制御できない場合は、多くの (快適な) オプションがあるかどうかわかりません。

  • ラッパーまたはプロキシ オブジェクトの意味がよくわかりません。どちらの方法でも final は final であるため、final フラグなしでクラスのコピーを作成する必要があります。
  • 厄介なリフレクション ハックを使用して、サイズ フィールドの最終処理を解除し、リフレクションを介してフィールド値を設定できるようにすることもできますが、Cube がコンストラクターでサイズから他の変数を初期化した場合、未定義の動作が発生する可能性があります。
  • 独自のシリアライゼーション クラスを作成すると、オブジェクトごとにRealCubeの新しいインスタンスを作成できます (最も効率的ではありませんが、機能します) (従来の Hadoop オブジェクトの再利用を利用するのではなく)。
  • のドメインはsize比較的小さいですか?(つまり、制限されたセット/範囲の値のみにすることができます)。その場合、有効なサイズ値ごとに RealCube のインスタンスを作成し、カスタムのシリアライゼーション実装を使用して、入力ストリームから読み取ったサイズに基づいて適切な Cube インスタンスを選択できます。
于 2012-03-29T01:57:35.410 に答える