26

標準のJavaオブジェクトのシリアル化を使用して、メモリバッファとの間で小さな(<1K)Javaオブジェクトを読み書きするとします。最も重要な部分は逆シリアル化です。つまり、メモリバッファ(バイト配列)からJavaオブジェクトを読み取ります。

この場合、標準のJavaシリアル化に代わるより高速な方法はありますか?

4

5 に答える 5

43

FSTもご覧ください。

オフヒープの読み取り/書き込み用のツールも提供します

于 2012-12-23T15:31:19.687 に答える
35

kryoを見てください。組み込みのシリアル化メカニズム(多くの文字列を書き出し、リフレクションに大きく依存する)よりもはるかに高速ですが、使用するのは少し難しいです。
編集:以下のR.MoellerはFSTを提案しましたが、これは今まで聞いたことがありませんが、kryoよりも高速で、Javaの組み込みシリアル化と互換性があるように見えます(これにより、さらに使いやすくなります)。その1日で

于 2012-12-23T14:10:15.807 に答える
7

GoogleprotobufまたはThriftを試してください。

于 2012-12-23T14:18:01.687 に答える
3

標準のシリアル化では、多くの型情報が追加され、オブジェクトが逆シリアル化されたときに検証されます。デシリアライズするオブジェクトのタイプがわかっている場合、これは通常は必要ありません。

できることは、クラスごとに独自のシリアル化メソッドを作成することです。これは、オブジェクトのすべての値をバイトバッファーに書き込むだけで、コンストラクター(またはそのようにスイングする場合はファクトリメソッド)を作成して、そのようなバイトバッファーを取得します。そこからすべての変数を読み取ります。

しかし、AlexRと同じように、本当にそれが必要かどうか疑問に思います。シリアル化は通常、データがプログラムを離れるときにのみ必要です(ディスクに保存されたり、ネットワークを介して別のプログラムに送信されたりする場合など)。

于 2012-12-23T13:57:18.073 に答える
2

Javaの標準的なシリアル化は低速であり、ディスク上で大量のバイトを使用することが知られています。独自のカスタムシリアル化を行うのは非常に簡単です。
javas stdのシリアル化は、デモプロジェクトには適していますが、上記の理由から、プロのプロジェクトにはあまり適していません。それ以上のバージョン管理は、あなたの管理下ではうまくいきません。

javaは、カスタムシリアル化に必要なすべてを提供します。私の投稿のデモコードを参照してください。

オブジェクトのJava偏(逆)シリアル化

このアプローチでは、バイナリファイル形式を指定することもできます。CまたはC#では、それを読み込むこともできます。別の利点カスタムsetializedオブジェクトは、メインメモリよりも必要なスペースが少なくて済みます(ブール値はメインメモリに4バイト必要ですが、カスタムシリアル化(バイトとして)の場合は1バイトしか必要ありません)

異なるプロジェクトパートナーがシリアル化されたデータを読み取る必要がある場合は、GoogleのProtobufが代わりになります。

于 2012-12-23T14:10:40.900 に答える