【问题标题】:Importance of Serializable interface while creating a session scoped managed bean创建会话范围托管 bean 时可序列化接口的重要性
【发布时间】:2014-07-27 20:56:32
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

阅读更多:

【讨论】:

    【解决方案2】:

    只是扩展了 kolossus 的答案。大多数像 Tomcat 这样的 Servlet 容器可能会使用将 Session 数据存储到物理内存的策略,以防重启或 Web 应用程序重新加载。

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

    您可以看到它在 Tomcat 文档中提到:

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

    Link for doc.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2015-08-22
      • 2011-04-16
      • 2011-06-08
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多