为什么关键字"瞬态"对Java中的Servlet HTTPSession没有影响?

Mar*_*rko 1 java servlets

瞬态关键字到底意味着什么?我有一个标记为瞬态的Class属性:

public class NodeClassifier {

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

...
}
Run Code Online (Sandbox Code Playgroud)

在将NodeClassifier对象存储并恢复到HttpSession之后,属性仍具有上一个Session的值.

它不应该是空的吗?

Environment是一个在Glassfish4上运行的普通Servlet.

Thi*_*ilo 5

transient 表示当对象以字节形式写出时,该值不会被序列化(使用默认的Java对象序列化).

会话的序列化可能会也可能不会发生(只需要在进程之间传递会话,或者将其持久化到磁盘,但通常不需要在单个JVM servlet容器中,只能将它们保存在内存中),所以你应该不依赖于那种"迷失"的价值观.

如果你不希望东西在会话中存活,不要把它放在那里.请考虑使用请求属性.