web-dev-qa-db-ja.com

Serializableインターフェイスをいつ実装する必要がありますか?

public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Serializableインターフェイスはいつ実装する必要がありますか?
  2. なぜそうするのですか?
  3. 利点やセキュリティはありますか?
141
theJava
  1. この「シリアル化」とは何ですか?

    オブジェクトまたはオブジェクトのグループを取得し、ディスクに配置するか、有線または無線のトランスポートメカニズムを介して送信し、後で別のコンピューターなどでプロセスを逆にすることができます。元のオブジェクトを復活させます。基本的なメカニズムは、オブジェクトを1次元のビットストリームにフラット化し、そのビットストリームを元のオブジェクトに戻すことです。

    スタートレックのトランスポーターのように、複雑なものを取り込んで1と0のフラットシーケンスに変換し、1と0のシーケンス(別の場所、場合によっては別の場所で)を取得し、元の複雑な「何か。"

    したがって、オブジェクトのコピーを保存する必要がある場合はSerializableインターフェイスを実装し、同じシステム上またはネットワーク経由で実行される別のプロセスに送信します。

  2. オブジェクトを保存または送信するため。

  3. オブジェクトの保存と送信が簡単になります。セキュリティとは関係ありません。

144
marcog
  1. クラスのインスタンスを一連のバイトに変換できるようにする場合、またはSerializableオブジェクトがクラスのインスタンスを参照する可能性があると考えられる場合は、Serializableインターフェイスを実装します。

  2. Serializableクラスは、それらのインスタンスを永続化したい場合、またはワイヤ経由で送信したい場合に役立ちます。

  3. Serializableクラスのインスタンスは簡単に送信できます。ただし、シリアル化にはセキュリティ上の影響があります。 Joshua BlochのEffective Javaを読んでください。

43
Steve Emmerson

この質問への答えは、おそらく驚くべきことに、never、またはより現実的には、レガシーコードとの相互運用性。これは、Joshua Blochによる Effective Java、3rd Edition の推奨事項です。

作成する新しいシステムでJavaシリアル化を使用する理由はありません

OracleのチーフアーキテクトであるMark Reinholdが記録上にあります 現在のJavaシリアル化メカニズムを削除することが長期的な目標であると述べているため。


なぜJavaシリアル化に欠陥がある

Javaは、言語の一部として、Serializableインターフェイスを使用して、オプトインできるシリアル化スキームを提供します。ただし、このスキームには難治性の欠点がいくつかあり、Java言語設計者は失敗した実験として扱う必要があります。

  • 基本的に、オブジェクトのtheシリアル化された形式について話すことができるふりをします。しかし、無限に多くのシリアル化スキームがあり、結果として無限に多くのシリアル化された形式になります。スキームを変更する方法なしに1つのスキームを課すことにより、アプリケーションはそれらに最も適切なスキームを使用できません。
  • オブジェクトを構築する追加の手段として実装され、コンストラクターまたはファクトリーメソッドが実行する前提条件チェックをバイパスします。トリッキーで、エラーが発生しやすく、余分な逆シリアル化コードをテストするのが難しい場合を除き、コードにはおそらく大きなセキュリティ上の弱点があります。
  • シリアル化されたフォームの異なるバージョンの相互運用性をテストすることは非常に困難です。
  • 不変オブジェクトの処理は面倒です。

代わりにすべきこと

代わりに、明示的に制御できるシリアル化スキームを使用してください。プロトコルバッファ、JSON、XML、または独自のカスタムスキームなど。

12
Raedwald