为什么HttpServlet实现Serializable?

在我对Servlet的理解中,Servlet将被Container实例化,它的init()方法将被调用一次,并且servlet将像一个单例一样直到JVMclosures。

我不希望我的servlet被序列化,因为当应用程序服务器恢复或正常启动时,它将被构build为新的。 这个servlet应该不包含会话特定的成员,所以把它写入磁盘并重新实例化是没有意义的。 这是否有实际用途?

我担心的是,我在那里放了一些不可序列化的字段,然后我的应用程序会在生成不同types的会话复制的生产环境中神秘地失败。

从技术上讲,我相信servlet容器被允许将servlet对象“钝化”到磁盘上,这与EJB会话bean可以类似。 所以你是正确的问问你的应用程序是否会由于不可序列化的字段而失败。

在实践中,我从来没有听说过一个容器在做这个事情,所以这只是早期J2EE不好的传统包袱。 我不会为此担心的。

HttpServlet应该通过序列化到磁盘并存活重新启动的servlet容器。 例如tomcat允许你设置标志,使这种生存。 下一个选项是使用JNDI进行传输。 这不是垃圾,只用于极端的使用情况。

谷歌似乎表示这样做是为了让容器作者可以select,如果他们想要的话。

你是正确的,该servlet不应该没有会话特定的成员,事实上,我认为你会希望尽可能less的状态。 如果你把所有的东西都存储在Session或者ServletConfig中,我想你可以在序列化之后继续存在。

就像会话对象被序列化以生存那些给出集群选项的servlet容器的caching,可能有容器将Servlet实例转移到另一个集群节点的选项? 我只是在这里猜测

可串行化被用作分布式环境中会话属性的标记接口

SRV.7.7.2分布式环境(JSR-154)

在标记为可分发的应用程序中,作为会话一部分的所有请求一次必须由一个Java虚拟机(“JVM”)处理。 容器必须能够适当地使用setAttribute或putValue方法来处理放置到HttpSession类实例中的所有对象。 以下限制是为了满足这些条件:

  • 容器必须接受实现Serializable接口的对象
  • 会议的迁移将由容器专用设施处理。

分布式servlet容器必须为容器无法支持迁移存储它们的会话所必需的机制的对象抛出IllegalArgumentException。

分布式servlet容器必须支持迁移实现Serializable的对象所需的机制。

(……)

容器提供者可以通过将会话对象及其内容从分布式系统的任何活动节点移动到系统的不同节点,来确保可扩展性和负载平衡和故障转移等服务质量 如果分布式容器持久化或迁移会话以提供服务质量function,则不会限制使用本机JVM序列化机制来序列化HttpSession及其属性。 开发人员不能保证容器会在会话属性上调用readObject和writeObject方法(如果他们实现了这些方法), 但是保证其属性的Serializable闭包将被保留