我无法理解序列化在会话作用域的JSF托管bean中是如何工作的。为什么在创建会话范围的JSF托管bean时,Serializable
接口的实现很重要?
答案 0 :(得分:5)
@SessionScoped
bean最终存储在用户的HTTP会话中。
这意味着当Java EE部署实现会话保留方案时(例如,tomcat将尝试在服务器关闭时将当前会话保存到 .ser 文件, if 部署者如此选择),这些会话范围的bean也将成为将持久存在的有效负载的一部分。
不可序列化的会话范围的bean在这里成为一个问题,因为它呈现它所属的整个HTTP会话,不可持久化(任何尝试序列化包含不可序列化成员的对象都会导致{{ 1}},除了一些特殊处理)
顺便说一句,这意味着即使您的会话范围的bean实现 Serializable ,其所有成员变量也必须是可序列化的或标记为NotSerializableException
。
简而言之,可以通过序列化持久化的给定HTTP会话的整个对象图必须标记为可序列化或transient
了解更多:
答案 1 :(得分:3)
只是扩展kolossus的答案。像Tomcat这样的大多数Servlet容器可能会使用将会话数据存储到物理内存的策略,以防重新启动或重新加载Web应用程序。
通常,存储/持久化Java实例/对象的方法是使用ObjectoutputStream,这确实需要持久保存Object / instance,以实现Serializable接口。
你可以看到它在Tomcat文档中提到过:
每当Apache Tomcat正常关闭并重新启动时,或者当 应用程序重新加载被触发,标准的Manager实现 将尝试将所有当前活动的会话序列化为磁盘文件 通过pathname属性定位。然后所有这些保存的会话 被反序列化和激活(假设它们没有过期 应用程序重新加载完成时的平均时间。