创建会话范围的托管bean时Serializable接口的重要性

时间:2014-07-27 20:56:32

标签: jsf session serialization jsf-2.2 managed-bean

我无法理解序列化在会话作用域的JSF托管bean中是如何工作的。为什么在创建会话范围的JSF托管bean时,Serializable接口的实现很重要?

2 个答案:

答案 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属性定位。然后所有这些保存的会话   被反序列化和激活(假设它们没有过期   应用程序重新加载完成时的平均时间。

Link for doc.