いくつかの理由があります (私はhttp://code.google.com/p/fast-serialization/の作成者です) 。
理由:
- 場合によっては、オブジェクトごとに read/writeObject を複数回呼び出して、各オブジェクトのクラス階層をクロールします。
- 部分的に悪いコーディング (1.7 で改善)
- よく使用されるクラスの中には、putfield/getfield などの古い遅い + 時代遅れのシリアライゼーション機能を利用するものがあります。
- 一時オブジェクトの割り当てが多すぎる
- 多くの検証 (バージョン管理、実装されたインターフェース)
- Java 入出力ストリームが遅い
- フィールド値を設定/取得するリフレクション。
- プリミティブの代わりに Integer や Long などの「大きな数」を必要とする JDK コレクションの使用。
- 実装には、特定のアルゴリズムの最適化が欠けています:-)
- x86 では、プリミティブは (ネイティブではなく Java コードで) ネットワーク バイト オーダーに並べ替えられます。
パフォーマンスを向上させるためには、古いバージョン管理スキームのサポートを放棄し (たとえば、現在の read/writeObject の動作方法は最適ではありません)、バージョン管理サポートなどのいくつかをオプションにするか、よりパフォーマンスに敏感なアプローチを選択する必要があります (可能です)。さらに、HotSpot はいくつかの組み込み関数を追加して、プリミティブの低レベル処理を改善する場合があります。API を設計するときは、パフォーマンスを念頭に置く必要がありますが、これはおそらく JDK シリアライゼーションには当てはまりませんでした。