为什么HttpServlet实现Serializable?

And*_*son 76 java session servlets serializable

在我对Servlet的理解中,Servlet将由Container实例化,其init()方法将被调用一次,并且servlet将像单例一样生存直到JVM关闭.

我不希望我的servlet被序列化,因为它将在app服务器恢复或正常启动时构建为新的.servlet应该不包含特定于会话的成员,因此将其写入磁盘并重新实例化是没有意义的.这有实际用途吗?

我担心的是,我在其中放置了一些不可序列化的字段,然后我的应用程序将在生产环境中神秘地失败,在该环境中将发生不同类型的会话复制.

ska*_*man 59

从技术上讲,我相信servlet容器允许将servlet对象"钝化"到磁盘,就像EJB会话bean一样.因此,如果您的应用因非序列化字段而失败,那么您提出的问题是正确的.

在实践中,我从来没有听说过这样做的容器,所以它只是早期J2EE早期糟糕的传统包袱.我不担心.

  • 但是,当 servlet 是线程安全的并且没有会话状态时,谁需要钝化 servlet? (2认同)
  • @dev这个bug是关于不可序列化的会话属性,而不是关于servlet的任何序列化. (2认同)

Ras*_*ara 10

HttpServlet应该通过序列化到磁盘并在servlet容器重启后继续运行.例如,tomcat允许你设置标志,使这种生存.下一个选项是使用JNDI进行传输.这不是垃圾,它仅用于极端用例.