2016-09-15 12 views
1

一時キーワードは正確に何を意味していますか?キーワード "transient"はJavaのサーブレットHTTPSessionに影響しません

public class NodeClassifier { 

    private transient HashMap<String, Node> nodeCache = new HashMap<>(); 

... 
} 

属性がまだ前のセッションから値を持っているのHttpSessionにNodeClassifierオブジェクトを格納し、回収した後:私はクラスの属性が一時的なものとしてマークされています。

空ではありませんか?

環境は、Glassfish4上で動作するプレーンサーブレットです。

+0

http://stackoverflow.com/questions/20700530/why-use-the-transient-keyword-in-java – imoteb

答えて

5

transientは、オブジェクトがバイトとして書き出されるときに値がシリアル化されない(デフォルトのJavaオブジェクトのシリアル化を使用して)ことを意味します。

セッションのシリアライズは、プロセス間でセッションを渡すか、ディスクに永続化する必要がありますが、通常はメモリ内に保持できる単一のJVMサーブレットコンテナでは不要です)したがって、値が「紛失」していることに頼るべきではありません。

あなたがセッションで生き残ることを望まないなら、そこに置かないでください。 代わりにリクエスト属性の使用を検討してください。

+1

わかりました。サーバーがシリアル化を決定しても、サーバーがセッションをメモリに保持している場合は失われません。 一時的には、実際にはセッションの格納を制限するだけです。 セッションに何かを入れるときに属性を消去するデフォルトの方法はありますか?いくつかのコールバックまたは同様のもの?あるいは私はそれを手動でコード化する必要がありますか? – Marko

+1

要求属性は、ネストされたオブジェクト構造であり、1つのオブジェクトがセッション中に永続化する際にクリアする必要のある「キャッシュ」を持っているため、私にとっては機能しません。 – Marko

+1

いいえ、 'transient'はシリアライゼーションを行うための非常に低レベルのメカニズムです。セッション記憶域を制限することは意図していません。セッションは、あなたが入れたすべてを保存することになっています。 – Thilo

関連する問題