【问题标题】:Saving objects in servlet session and java.io.NotSerializableException在 servlet 会话和 java.io.NotSerializableException 中保存对象
【发布时间】:2010-05-17 08:46:03
【问题描述】:
SEVERE: IOException while loading persisted sessions:
java.io.WriteAbortedException:
writing aborted; java.io.NotSerializableException:
这意味着这个对象不能被持久化在硬盘上。
这是否意味着将不实现“Serializable”的 Session 对象保存在其中是不安全的?
没听说Session对象中保存不可序列化的对象有限制。
这只是意味着 Tomcat 将始终将它们保存在内存中,对吗?
【问题讨论】:
标签:
java
session
servlets
【解决方案1】:
这是否意味着不安全
保留在没有的 Session 对象中
实现“可序列化”?
完全正确,是的。
但是,如果它们实际上不需要进行任何序列化,许多 servlet 容器会让您侥幸逃脱。
例如,Tomcat 不关心会话属性是否可序列化,除非您启用会话复制。它需要能够序列化属性以将它们复制到集群中的其他服务器。
在您的情况下,容器似乎正在尝试将会话数据保存到磁盘,这又需要序列化。
【解决方案2】:
Servlet 规范定义了分发会话的规则(2.5 规范实际上并没有描述如何为分布式环境以外的任何东西持久化会话,但语义应该是相同的)。在这种情况下,通常最容易实现Serializable。如果您想收到这些事件的通知,也可以使用HttpSessionActivationListener 接口。
【解决方案3】:
不仅当对象被持久化到硬盘时,而且当转移到分布式环境中的另一个节点时,都会尝试序列化。尽管 servlet 规范不要求对象可序列化,但这样做并不是一个坏习惯。