0

Serializable インターフェースから Externalizable に切り替えることで、現在のシリアライゼーションのパフォーマンスを改善しようとしていますが、カスタムでパフォーマンスの高いシリアライゼーションを作成するためのベスト プラクティスに関するドキュメントはあまり見つかりませんでした。私の現在のソリューションは、ストック Java シリアライゼーションの約 2 倍の速さです。これは良いものですが、期待していた大幅な改善には見えません (シリアライゼーション手法/ライブラリのベンチマーク) 。

プリミティブ以外の場合は、フィールドが存在することを示すために 0 または 1 を書き込み、値が 1 の場合はフィールドを読み取るというアプローチをとっています。

if (in.read() == 1) {
    name = in.readUTF();
}

それは正しいと思いますか?使用するより良いエンコーディングはありますか? マップ、リスト、およびその他の複雑なデータ構造についてはどうでしょう。列挙型のデフォルトのシリアル化は問題ありませんか?

ありがとう。

4

2 に答える 2

2

既存のシリアル化フレームワークを使用しない理由はありますが、Java に組み込まれているものよりも優れていますか? 私自身の好みはProtocol Buffersですが、Thrift などの代替手段もあります。本当に避けられない場合を除き、独自の低レベルのシリアル化を行うことは避けたいと思います。リンク先のページには、多くの代替案が示されています。

パフォーマンスと保守性の両方を考慮する必要があります。優れたパフォーマンスを提供Externalizable できますが、最終的にはそれをどのように実装するかによって異なります-そして、良い仕事をすることも悪い仕事をすることもできます...しかし、それはすべて手動です.

于 2012-04-20T16:35:05.537 に答える
0

保守性の観点から、生成されたデータ転送オブジェクトを使用しようとしています。このようにして、単一の定義から toString、hashCode、equals、readObject、writeObject、および場合によってはそれらの Builder クラスも生成します。

速度に関しては、生データの種類によって異なります。逆シリアル化/逆シリアル化には 3 つの主なコストがあります。

  • リフレクションを使用すると、フィールドと型をハードコーディングできるため、これがカスタム シリアル化の主な利点です。
  • 新しいオブジェクトの作成。リサイクルされたオブジェクトを使用できますが、これは注意が必要です。
  • 読み取り/書き込みのバイト数。よりコンパクトなフォームを使用すると役立ちます。
于 2012-04-20T17:53:05.420 に答える