transient
キーワードを使用して、フィールドのシリアル化を回避できます。それを行う他の方法はありますか?
4 に答える
http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html
概要:機密データのシリアル化の防止 機密データを含むフィールドはシリアル化しないでください。そうすることで、シリアライゼーション ストリームにアクセスできる関係者に値が公開されます。フィールドがシリアル化されないようにするには、いくつかの方法があります。
- フィールドをプライベート トランジェントとして宣言します。
- 問題のクラスの serialPersistentFields フィールドを定義し、フィールド記述子のリストからフィールドを省略します。
- フィールドをシリアル化ストリームに書き込まない (つまり、ObjectOutputStream.defaultWriteObject を呼び出さない) クラス固有のシリアル化メソッド (つまり、writeObject または writeExternal) を記述します。
ここにいくつかのリンクがあります。
何らかの理由で一時的な方法が適していない場合は、writeObject メソッドと readObjectメソッドをオーバーライドすることで、シリアル化を直接行うことができます。次に、必要なフィールドを含めたり省略したりできます。
これがキーワードとしての一時的な意味です。その全体的な目的は、何らかの理由でデータのシリアル化を停止することです。
プロセスをより細かく制御したい場合は、ObjectOutputStream/ObjectInputStream がシリアライゼーション プロセスの一部として使用する writeObject/readObject メソッドを使用できます。また、それをいくつかのカスタム アノテーションまたは必要なロジックと組み合わせることができます。
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException
Externalizableインターフェイスを使用して独自のプロトコルを作成できます。これは、JVM によってフックされるプライベート メソッドが含まれていないため、Serializable よりも優れていると思います (writeObject
およびreadObject
)。Serializable
インターフェイスを実装する代わりに、次のExternalizable
2 つのメソッドを含むを実装できます。
public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
ただし、何も使用しないのとは異なりSerializable
、現在は無料で提供されています。つまり、プロトコルは完全にあなたの手にあり、transient/non triansient フィールドなどを上書きします。