繁体   English   中英

为什么 session 变量必须是可序列化的?

[英]Why does a session variable have to be serializable?

尝试存储自定义对象的列表变量时
session.setAttribute抱怨变量不可序列化。

您可以随时将整个Servlet会话序列化到磁盘或其他存储中。 因此,其中的所有对象必须可序列化。

正如其他答案所解释的那样,要求会话变量可序列化的目的是允许容器框架使用对象序列化来:

  • 在分布式Web服务实现中的服务器实例之间迁移会话
  • 在服务器重新启动后保留会话,或节省内存。

但是有趣的是,Servlet 3.0规范实际上并不需要这样做。 相反,它说:

7.7.2分布式环境

在标记为可分发的应用程序中,作为会话一部分的所有请求必须一次由一个JVM处理。 容器必须能够使用setAttributeputValue方法适当地处理放置在HttpSession类实例中的所有对象。 为了满足这些条件,施加了以下限制:

  • 容器必须接受实现Serializable接口的对象。

  • 容器可以选择支持在HttpSession存储其他指定的对象,例如对Enterprise JavaBeans组件和事务的引用。

  • 会话的迁移将由特定于容器的设施处理。 分布式Servlet容器必须为对象无法抛出的IllegalArgumentException抛出IllegalArgumentException ,该对象不能支持迁移存储它们的会话所必需的机制。 分布式Servlet容器必须支持迁移实现Serializable对象所必需的机制。

这些限制意味着开发人员可以确保除了在非分布式容器中遇到的并发问题之外,没有其他并发问题。 容器提供程序可以通过将会话对象及其内容从分布式系统的任何活动节点移动到系统的其他节点,来确保可伸缩性和服务质量功能(例如负载平衡和故障转移)。

如果我们仔细地分析它,那就是在说:

  • 分布式容器必须支持对象序列化,作为在会话中迁移对象的一种方式。

  • 无需将应用程序标记为可分发。

  • 容器不必是分布式容器。

  • 容器可以支持其他迁移对象的方式。

那么这是什么意思? 好吧,我认为这意味着您的会话对象实现Serializable的明显要求源于您对容器的选择以及实现Webapp的选择方式。 假设您可以更改这些选择。

Servlet容器(您的应用程序服务器,例如Tomcat)可能希望将会话信息存储到磁盘。 这将帮助您在重新启动服务器时保留用户会话,并且如果它不将每个会话对象存储在内存中,而是在需要时查找它,则还可以使其更有效地管理内存。

因此,您的会话对象需要可Serializable

由于要访问不同请求中的model scope,因此您需要将其存储在http session中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM