一時的なキーワードを与える以外に、シリアル化からJavaオブジェクトを拒否できますか

StackOverflow https://stackoverflow.com/questions/1292474

質問

使用することにより、シリアル化フィールドを避けることができます transient キーワード。それを行う他の方法はありますか?

役に立ちましたか?

解決

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

概要:機密データを含む機密データフィールドのシリアル化を防ぐことは、シリアル化されるべきではありません。そうすることで、シリアル化ストリームにアクセスすると、任意の当事者に価値を公開します。フィールドがシリアル化されるのを防ぐ方法はいくつかあります。

  1. フィールドをプライベートトランジェントとして宣言します。
  2. 問題のクラスのSerialPersistentFieldsフィールドを定義し、フィールド記述子のリストからフィールドを省略します。
  3. シリアル化ストリームにフィールドを書き込むことのないクラス固有のシリアル化方法(つまり、WriteObjectまたはWriteExternal)を作成します(つまり、objectputStream.defaultwriteObjectを呼び出しない)。

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

SerialPersistenetfieldsの宣言。

シリアル化アーキテクチャの仕様。

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

他のヒント

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

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

プロセスをより細かい粒度制御が必要な場合は、Serializationプロセスの一部としてObjectOutputStream/ObjectInputStreamが使用するWriteObject/ReadObjectメソッドを使用でき、それをいくつかのカスタム注釈または必要なロジックと組み合わせることができます。

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException

で独自のプロトコルを作成できます 外部化可能 インターフェース、私の意見では、JVMに引っ掛けられたプライベートメソッドが含まれていないため、シリアル化可能なものよりも優れています。writeObjectreadObject)。実装する代わりに Serializable インターフェイス、実装できます Externalizable, 、2つの方法が含まれています。

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

使用とは異なります Serializable ただし、今は無料で提供されていません。あれは、 プロトコルは完全にあなたの手にあります, 、オーバーリングトランジェント/非トライアン症フィールドなど。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top