14

transientキーワードを使用して、フィールドのシリアル化を回避できます。それを行う他の方法はありますか?

4

4 に答える 4

20

http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html

概要:機密データのシリアル化の防止 機密データを含むフィールドはシリアル化しないでください。そうすることで、シリアライゼーション ストリームにアクセスできる関係者に値が公開されます。フィールドがシリアル化されないようにするには、いくつかの方法があります。

  1. フィールドをプライベート トランジェントとして宣言します。
  2. 問題のクラスの serialPersistentFields フィールドを定義し、フィールド記述子のリストからフィールドを省略します。
  3. フィールドをシリアル化ストリームに書き込まない (つまり、ObjectOutputStream.defaultWriteObject を呼び出さない) クラス固有のシリアル化メソッド (つまり、writeObject または writeExternal) を記述します。

ここにいくつかのリンクがあります。

serialPersistenetFields を宣言します。

シリアライゼーション アーキテクチャの仕様。

オブジェクトのシリアル化におけるセキュリティ。

于 2009-08-18T08:18:25.120 に答える
9

何らかの理由で一時的な方法が適していない場合は、writeObject メソッドと readObjectメソッドをオーバーライドすることで、シリアル化を直接行うことができます。次に、必要なフィールドを含めたり省略したりできます。

于 2009-08-18T08:17:39.787 に答える
8

これがキーワードとしての一時的な意味です。その全体的な目的は、何らかの理由でデータのシリアル化を停止することです。

プロセスをより細かく制御したい場合は、ObjectOutputStream/ObjectInputStream がシリアライゼーション プロセスの一部として使用する writeObject/readObject メソッドを使用できます。また、それをいくつかのカスタム アノテーションまたは必要なロジックと組み合わせることができます。

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException
于 2009-08-18T08:18:49.597 に答える
5

Externalizableインターフェイスを使用して独自のプロトコルを作成できます。これは、JVM によってフックされるプライベート メソッドが含まれていないため、Serializable よりも優れていると思います (writeObjectおよびreadObject)。Serializableインターフェイスを実装する代わりに、次のExternalizable2 つのメソッドを含むを実装できます。

public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

ただし、何も使用しないのとは異なりSerializable、現在は無料で提供されています。つまり、プロトコルは完全にあなたの手にあり、transient/non triansient フィールドなどを上書きします。

于 2009-08-18T08:23:07.640 に答える