Java オブジェクトを DirectByteBuffers に書き込んでから、デシリアライズすることなく、高速な方法でオブジェクトにアクセスして操作したいので、これを行うことに興味があります。アイデアは、GC マネージド ヒープでオブジェクトを作成することを避け、代わりにヒープ以外の DirectByteBuffers でオブジェクトを作成し、これらのオブジェクトを操作する安全な方法を用意することです。
4 に答える
Unsafe クラスを使用してオフセットをキャプチャすることができます。ただし、有効な ObjectPointer を byteBuffer に取得することはできないため、(理論的には) アクセス可能なオブジェクトを bytebuffer に作成することはできますが、実際にそれらを操作することはできません。
実行する方法は、実行時にバイトコードを生成し、ゲッター/セッターが呼び出されたときにバイトバッファーにアクセスする一種の「ポインター」ラッパークラスを作成することです。
このようなものの例(ただし、バイトバッファの代わりにバイト配列を使用)は、ここにあります
http://code.google.com/p/fast-serialization/wiki/Structsはじめに
この種の解決策についてどう思いますか、それはちょっとした回避策です...
interface OffsetMemberMap {
Map<String,Long> offsetMemberMap();
}
アイデアは、上記のインターフェイスを実装するオブジェクトを作成することです。このマップは、各メンバーの文字列に対してメモリ アドレスを格納します。子オブジェクトが最初に作成され、DirectByteBuffer に追加されると、オフセット位置がこのマップ内の親に格納されます。特定のメンバーにアクセスするには、ユーザーはそのメンバーをアドレス指定する文字列を提供する必要があるため、必要なものだけが逆シリアル化されます。これにより、大きなリンク オブジェクトを DirectByteBuffers に格納でき、書き込み/読み取り時に必要なビットのみをシリアル化/逆シリアル化できます。
したがって、HeadTeacher メンバーを持つ School クラスがあり、HeadTeacher に Details メンバーがある場合、school.headteacher.details のような文字列を使用して、DirectByteBuffer から詳細インスタンスにアクセスできます。
すなわち。親オブジェクトのアドレスがある限り、バイト バッファから親オブジェクトを取得できるため、指定された子オブジェクトを取得し続けることができます。