目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
直列化復元されたオブジェクトが、保証されるべきである不変式のセットを壊すような状態にならないように、クラスが独自の直列化と直列化復元のメソッドを定義することができます。あるクラスのデータメンバ間で維持する必要がある不変式のセットがある場合、これらの不変式について知ることができるのはそのクラスだけなので、これらの不変式を検査する直列化復元メソッドを提供するかどうかは、そのクラスの作成者次第です。セキュリティを重視した実装を行う際には、直列化可能クラスの
readObject
メソッドが実際に public コンストラクタでなければならず、そのように扱う必要があります。これは、readObject
メソッドが暗黙的である場合と明示的である場合のどちらにもあてはまります。readObject
メソッドに提供されたバイトストリームが、適切に構築された正しいタイプのオブジェクトを直列化することによって生成されると想定するのは危険です。より防御性に優れたプログラミングを行うには、構築中のオブジェクトに悪影響を及ぼそうとする悪意あるユーザによってバイトストリームが提供されることを想定する必要があります。このことは、セキュリティを関知しない場合でも重要です。ディスクファイルが壊れ、直列化データが無効になることも起こり得ます。したがって、そのような不変式を検査することは、単にセキュリティのためだけではなく、有効性を確保する手段でもあります。しかし、これを行うことができるのは、特定クラスのコードの中だけです。これは、どの不変式を維持し、検査するかを直列化パッケージで判断する方法がないからです。
JavaTM 2 SDK, Standard Edition バージョン 1.4 では、クラス定義メソッド
readObjectNoData
のサポートが追加されました (「3.5 readObjectNoData メソッド」を参照)。フィールドをデフォルト以外の値に初期化するfinal
以外の直列化可能クラスでは、サブクラスインスタンスが直列化復元されるときに直列化ストリームがそのクラスを直列化復元されたオブジェクトのスーパークラスとしてリストしない場合に、一貫した状態を保証するためにreadObjectNoData
メソッドを定義する必要があります。これは、受け取り側が、送り側とは異なるバージョンの直列化復元されたインスタンスのクラスを使用し、受け取り側のバージョンが、送り側のバージョンによって継承されないクラスを継承する場合に発生する可能性があります。また、直列化ストリームが改変された場合にも発生することがあります。したがって、readObjectNoData
は、「悪意のある」または不正なソースストリームであっても、直列化復元されたオブジェクトを正しく初期化するのに役立ちます。