web-dev-qa-db-ja.com

Javaより良いパフォーマンスのシリアライゼーション代替案

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

この場合、標準のJavaシリアライゼーションに代わる高速な方法はありますか?

20
Michael

kryo をご覧ください。組み込みのシリアル化メカニズム(多くの文字列を書き出し、リフレクションに大きく依存する)よりはるかに高速ですが、使用するのが少し難しいです。
編集:以下のR.Moellerの提案 [〜#〜] fst [〜#〜] 、これまで聞いたことがないが、kryoより高速で互換性があるように見えるJava組み込みのシリアライゼーション(これによりさらに使いやすくなるはずです)があるので、最初の

32
radai

[〜#〜] fst [〜#〜] もご覧ください。

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

36
R.Moeller

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

7
SpyBot

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

あなたができることは、オブジェクトのすべての値をバイトバッファに書き込むクラスごとに独自のシリアル化メソッドを作成し、そのようなバイトバッファを取り、そこからすべての変数を読み取ります。

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

3
Philipp

Javaの標準的なシリアル化は遅く、ディスク上で膨大なバイト数を使用することが知られています。独自のシリアル化を行うのは非常に簡単です。
javas stdシリアライゼーションはデモプロジェクトには適していますが、上記の理由により、プロフェッショナルプロジェクトにはあまり適していません。それ以上のバージョン管理は十分に制御できません。

Javaはカスタムシリアライゼーションに必要なすべてを提供します。私の投稿のデモコードを参照してください

オブジェクトのJava部分(逆)シリアライズ

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

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

1
AlexWien