在servlet会话和java.io.NotSerializableException中保存对象

时间:2010-05-17 08:46:04

标签: java session servlets

 SEVERE: IOException while loading persisted sessions:
         java.io.WriteAbortedException:
         writing aborted; java.io.NotSerializableException:

这意味着此对象不能保留在硬盘上。

这是否意味着保留未实现“Serializable”的Session对象是不安全的?

我没有听说在Session对象中保存不可序列化的对象存在限制。

这只是意味着Tomcat将始终将它们保存在内存中,对吗?

3 个答案:

答案 0 :(得分:8)

  

这是否意味着它不安全   保留在不包含的Session对象中   实现“Serializable”?

这是完全正确的,是的。

但是,如果实际上不需要进行任何序列化,许多servlet容器都会让你逃脱它。

例如,Tomcat不关心会话属性是否可序列化,除非启用会话复制。它需要能够序列化属性以将它们复制到集群中的其他服务器。

在您的情况下,似乎容器正在尝试将会话数据持久保存到磁盘,这又需要序列化。

答案 1 :(得分:2)

Servlet规范定义了分发会话的规则(2.5规范实际上并没有描述如何为除分布式环境之外的任何东西持久化会话,但语义应该是相同的)。在这种情况下,通常最容易实现Serializable。如果您希望收到有关这些事件的通知,您还可以使用HttpSessionActivationListener界面。

答案 2 :(得分:1)

不仅在对象持久存储到硬盘时,而且在传输到分布式环境中的另一个节点时,也尝试进行序列化。尽管servlet规范并未强制要求对象可序列化,但这样做并不是一种坏习惯。