この質問への答えは、おそらく驚くべきことに、 決して、またはより現実的には、レガシーコードとの相互運用性を強要された場合に限られます。これは、Joshua BlochによるEffective Java、3rd Editionの推奨事項です。
作成する新しいシステムでJavaシリアル化を使用する理由はありません
OracleのチーフアーキテクトであるMark Reinholdは、現在のJavaシリアライゼーションメカニズムを削除することが長期的な目標であると記録に残しています。
Javaシリアライゼーションに欠陥がある理由
Javaは言語の一部として、Serializable
インターフェースを使用してオプトインできるシリアライゼーションスキームを提供します。ただし、このスキームにはいくつかの扱いにくい欠陥があり、Java言語設計者は失敗した実験として扱う必要があります。
- これは、基本的に1はについて話すことができることをふりオブジェクトの直列化された形式。しかし、シリアル化スキームは無限にあり、その結果、シリアル化された形式は無限に多くなります。1つのスキームを課すことにより、スキームを変更する方法がなければ、アプリケーションはそれらに最も適したスキームを使用できません。
- これは、オブジェクトを構築する追加の手段として実装され、コンストラクターまたはファクトリーメソッドが実行する前提条件チェックをバイパスします。トリッキーでエラーが発生しやすく、追加の逆シリアル化コードをテストするのが難しい場合を除いて、コードにセキュリティギャップがあります。
- シリアル化されたフォームの異なるバージョンの相互運用性をテストすることは非常に困難です。
- 不変オブジェクトの処理は面倒です。
代わりに何をすべきか
代わりに、明示的に制御できるシリアル化スキームを使用してください。プロトコルバッファ、JSON、XML、独自のカスタムスキームなど。