標準のJavaオブジェクトのシリアル化を使用して、メモリバッファとの間で小さな(<1K)Javaオブジェクトを読み書きするとします。最も重要な部分は逆シリアル化です。つまり、メモリバッファ(バイト配列)からJavaオブジェクトを読み取ります。
この場合、標準のJavaシリアル化に代わるより高速な方法はありますか?
標準のJavaオブジェクトのシリアル化を使用して、メモリバッファとの間で小さな(<1K)Javaオブジェクトを読み書きするとします。最も重要な部分は逆シリアル化です。つまり、メモリバッファ(バイト配列)からJavaオブジェクトを読み取ります。
この場合、標準のJavaシリアル化に代わるより高速な方法はありますか?
FSTもご覧ください。
オフヒープの読み取り/書き込み用のツールも提供します
GoogleprotobufまたはThriftを試してください。
標準のシリアル化では、多くの型情報が追加され、オブジェクトが逆シリアル化されたときに検証されます。デシリアライズするオブジェクトのタイプがわかっている場合、これは通常は必要ありません。
できることは、クラスごとに独自のシリアル化メソッドを作成することです。これは、オブジェクトのすべての値をバイトバッファーに書き込むだけで、コンストラクター(またはそのようにスイングする場合はファクトリメソッド)を作成して、そのようなバイトバッファーを取得します。そこからすべての変数を読み取ります。
しかし、AlexRと同じように、本当にそれが必要かどうか疑問に思います。シリアル化は通常、データがプログラムを離れるときにのみ必要です(ディスクに保存されたり、ネットワークを介して別のプログラムに送信されたりする場合など)。
Javaの標準的なシリアル化は低速であり、ディスク上で大量のバイトを使用することが知られています。独自のカスタムシリアル化を行うのは非常に簡単です。
javas stdのシリアル化は、デモプロジェクトには適していますが、上記の理由から、プロのプロジェクトにはあまり適していません。それ以上のバージョン管理は、あなたの管理下ではうまくいきません。
javaは、カスタムシリアル化に必要なすべてを提供します。私の投稿のデモコードを参照してください。
このアプローチでは、バイナリファイル形式を指定することもできます。CまたはC#では、それを読み込むこともできます。別の利点カスタムsetializedオブジェクトは、メインメモリよりも必要なスペースが少なくて済みます(ブール値はメインメモリに4バイト必要ですが、カスタムシリアル化(バイトとして)の場合は1バイトしか必要ありません)
異なるプロジェクトパートナーがシリアル化されたデータを読み取る必要がある場合は、GoogleのProtobufが代わりになります。