私はEffectiveJavaを読んでいることに出くわしたという疑問を投稿します。それが本当に単純で率直な疑問であるならば、私は謝罪します。したがって、項目74-Serializableを慎重に実装するで、プライベートフィールドとパッケージプライベートフィールドを使用してクラスに適切な情報隠蔽を実装した後でも、効果が失われる傾向があると彼は言っています。私が過去に読んだものは何でも、すべてのシリアル化は、オブジェクトをバイトストリーム形式に変換し、逆シリアル化後、同じオブジェクトが保持されます。このプロセスでデータの非表示をどのように失いますか?
3 に答える
シリアル化と逆シリアル化を使用して、オブジェクトの内部状態の値にアクセスできる可能性があります。
オブジェクトをシリアル化することで、他の方法では読み取れないプライベートフィールドの値を読み取ることができる場合があります。逆に、インスタンスに逆シリアル化する巧妙に作成されたバイト配列を作成すると、不正な状態で初期化できる可能性があります。
OOPのコンテキストでのシリアル化に関するデータ隠蔽の問題は@candiruによって指摘されています。
ただし、シリアル化には別の側面もあります。
シリアル化されたファイルをネットワーク経由で送信できるため、ファイルをのぞき見したり、プライベートであるはずのファイルを簡単に危険にさらしたりすることができます。
以下は、(デフォルトの手法を使用して)シリアル化したBeanクラスの内容です。シリアル化されたファイルをテキストエディタで開くと、コンテンツを表示できました。
’ sr SerializationPractice1 I ageL extrat Ljava/lang/String;L nameq ~ xp
pt SidKumarq ~ x
これで、クラスについて知らなくても、以下のものを簡単に見つけることができます。
- クラスの名前:SerializationPractice1
- 名前の値として指定された文字列属性はSidKumarです
あなたが確かに気付くことができるこれらのこと; 他の詳細はそれほど明確ではありません。そして、上記の情報は正しいです。
シリアル化には、個人データを外の世界に公開する可能性があると私は信じています。そして、それが外部化(外部化可能タイプのインスタンスを使用することは非常に便利です)です。ExternalizableインターフェースのwriteExternal(...)メソッドを実装することにより、開発者は、デフォルトのシリアル化ランタイム実装に完全に依存するのではなく、シリアル化プロセスを完全に制御できます。以下は私のアイデアの擬似コードです(実際のメソッドシグネチャは、より広いアイデアを広めることを目的とした単なる擬似コードであるため、無視します)。
class SensitiveData implemets java.io.Externalizable{
int sensitiveInteger;
writeExternal (OutputData outputData){
//encrypt sensitiveInteger here
//serialize the sensitiveInteger which is now encrypted to any persistent store
outputData.writeInt(sensitiveInteger);
//do other processing
}
}
実際、なぜ暗号化するだけなのか、シリアル化するインスタンスが「大きい」状況で必要な場合は、シリアル化されたバイトを永続ストアに圧縮することをお勧めします。