1

Java オブジェクトを DirectByteBuffers に書き込んでから、デシリアライズすることなく、高速な方法でオブジェクトにアクセスして操作したいので、これを行うことに興味があります。アイデアは、GC マネージド ヒープでオブジェクトを作成することを避け、代わりにヒープ以外の DirectByteBuffers でオブジェクトを作成し、これらのオブジェクトを操作する安全な方法を用意することです。

4

4 に答える 4

1

Unsafe クラスを使用してオフセットをキャプチャすることができます。ただし、有効な ObjectPointer を byteBuffer に取得することはできないため、(理論的には) アクセス可能なオブジェクトを bytebuffer に作成することはできますが、実際にそれらを操作することはできません。

実行する方法は、実行時にバイトコードを生成し、ゲッター/セッターが呼び出されたときにバイトバッファーにアクセスする一種の「ポインター」ラッパークラスを作成することです。

このようなものの例(ただし、バイトバッファの代わりにバイト配列を使用)は、ここにあります

http://code.google.com/p/fast-serialization/wiki/Structsはじめに

于 2013-10-18T14:50:11.520 に答える
0

この種の解決策についてどう思いますか、それはちょっとした回避策です...

 interface OffsetMemberMap {
     Map<String,Long> offsetMemberMap();
}

アイデアは、上記のインターフェイスを実装するオブジェクトを作成することです。このマップは、各メンバーの文字列に対してメモリ アドレスを格納します。子オブジェクトが最初に作成され、DirectByteBuffer に追加されると、オフセット位置がこのマップ内の親に格納されます。特定のメンバーにアクセスするには、ユーザーはそのメンバーをアドレス指定する文字列を提供する必要があるため、必要なものだけが逆シリアル化されます。これにより、大きなリンク オブジェクトを DirectByteBuffers に格納でき、書き込み/読み取り時に必要なビットのみをシリアル化/逆シリアル化できます。

したがって、HeadTeacher メンバーを持つ School クラスがあり、HeadTeacher に Details メンバーがある場合、school.headteacher.details のような文字列を使用して、DirectByteBuffer から詳細インスタンスにアクセスできます。

すなわち。親オブジェクトのアドレスがある限り、バイト バッファから親オブジェクトを取得できるため、指定された子オブジェクトを取得し続けることができます。

于 2013-10-18T16:52:37.340 に答える