目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
リソースのコントロールアクセスを行うクラスを開発する場合には、機密性の高い情報と機能が保護されるように注意しなければなりません。直列化復元の際、オブジェクトの private 状態が復元されます。たとえば、ファイル記述子には、オペレーティングシステムにアクセスできるハンドルが含まれています。状態の復元はストリームから行われるので、ファイル記述子を偽造できるということは、なんらかの不法なアクセスが可能だということです。したがって、直列化の実行時には安全なアプローチを取るべきであり、ストリームにオブジェクトの有効な表現だけが含まれているとは信じないことです。クラスを正しく保つには、オブジェクトの機密性の高い状態を、ストリームから復元しないようにするか、そのクラスによって再び検証するようにする必要があります。クラスの機密性の高いデータを保護するにはいくつかの技法があります。もっとも簡単な技法は、機密性の高いデータを含むフィールドを private transient とすることです。transient フィールドは、持続的ではなく、持続性機構によって保存されません。フィールドをこのようにすると、その状態がストリームに現われず、直列化復元の際にも復元されません。(private フィールドの) 書き込みや読み込みをそのクラスの外部で代わりに行うことはできないので、そのクラスの transient フィールドは安全です。
特に機密性の高いクラスは、一切直列化すべきではありません。これを確実にするには、オブジェクトに
Serializable
やExternalizable
インタフェースを実装しないことです。クラスによっては、書き込みや読み込みを許し、直列化復元の際に状態を特に処理して再検証する方が便利なこともあります。クラスには
writeObject
とreadObject
のメソッドを実装して、適切な状態だけを保管および復元すべきです。アクセスが拒否される場合には、NotSerializableException がスローされ、それ以上のアクセスは行われません。