Jsf 创建会话范围的托管bean时可序列化接口的重要性

Jsf 创建会话范围的托管bean时可序列化接口的重要性,jsf,session,serialization,jsf-2.2,managed-bean,Jsf,Session,Serialization,Jsf 2.2,Managed Bean,我无法理解序列化在会话范围的JSF托管bean中是如何工作的。为什么在创建会话范围的JSF托管bean时,Serializable接口的实现很重要?@SessionScopedbean最终存储在用户的HTTP会话中 这意味着,当Java EE部署实现会话保留方案时(例如,如果部署人员选择,tomcat将尝试在服务器关闭时将当前会话保存到.ser文件),这些会话范围的bean也将是将被持久化的有效负载的一部分 不可序列化的会话范围bean在这里成为一个问题,因为它会使它所属的整个HTTP会话不可持

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

@SessionScoped
bean最终存储在用户的HTTP会话中

这意味着,当Java EE部署实现会话保留方案时(例如,如果部署人员选择,tomcat将尝试在服务器关闭时将当前会话保存到.ser文件),这些会话范围的bean也将是将被持久化的有效负载的一部分

不可序列化的会话范围bean在这里成为一个问题,因为它会使它所属的整个HTTP会话不可持久化(任何序列化包含不可序列化成员的对象的尝试都会导致
NotSerializableException
,除非进行一些特殊处理)

顺便说一句,这意味着即使会话范围的bean实现了Serializable,其所有成员变量也必须是可序列化的,或者标记为
transient

简而言之,可以通过序列化持久化的给定HTTP会话的整个对象图必须标记为可序列化或瞬态

阅读更多:


只是扩展了科洛索斯的答案。大多数Servlet容器(如Tomcat)可能使用将会话数据存储到物理内存的策略,以防重新启动或重新加载web应用程序

存储/持久化Java实例/对象的常用方法是使用,这确实需要持久化对象/实例来实现接口

您可以看到,Tomcat文档中提到:

只要Apache Tomcat正常关闭并重新启动,或者 标准管理器实现触发应用程序重新加载 将尝试将所有当前活动会话序列化为磁盘文件 通过路径名属性定位。然后,所有保存的会话都将被删除 被反序列化并激活(假设它们在 应用程序重新加载完成时的平均时间