25

是什么导致Tomcat出现这种错误?

SEVERE: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
   bean.ProjectAreaBean
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at java.util.ArrayList.readObject(ArrayList.java:593)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(
    DelegatingMethodAccessorImpl.java:25)
4

2 回答 2

60

只需执行Serializable

如果你得到一个NotSerializableException类似的内容,

java.io.NotSerializableException: bean.ProjectAreaBean

那么它只是意味着由异常消息中的完全限定名称标识的类(bean.ProjectAreaBean在您的情况下)没有实现该Serializable接口,而后面的代码是预期的。修复比较简单,让类实现Serializable接口即可。

package bean;

import java.io.Serializable;

public class ProjectAreaBean implements Serializable {
    private static final long serialVersionUID = 1L;

    // ...
}

serialVersionUID字段不是必需的,但强烈建议使用,因为这可以保持类的不同版本及其实例​​的序列化表示之间的二进制兼容性。因此,当您稍后向该类添加一个新的可序列化字段时,您需要更改该serialVersionUID字段(通常只需将其增加 1 就足够了)以防止在反序列化该类的旧版本实例时出现问题。像 Eclipse 这样的 IDE 还提供了一个选项来(重新)生成serialVersionUID值,该值基本上是基于所有字段计算的哈希值。

也可以看看:


标记不可序列化的字段transient

如果您的Serializable类又包含引用另一个类的实例的字段/属性,而该实例绝对不能生成Serializable(通常,这些代表资源,例如InputStream,Connection等),那么您需要标记它transient。这样,它将在类的序列化过程中被跳过。

private transient SomeObject thisWillNotBeSerialized;

您需要了解,反序列化后该字段将始终变为null. 请注意,反序列化期间不会调用类的构造函数和初始化块。如果您想对序列化和反序列化进行更细粒度的控制,请覆盖readObject()andwriteObject()方法。您可以在以下链接中找到具体示例:


为什么要序列化?

至于为什么需要担心序列化,这是因为大多数 Java servlet 容器(如 Tomcat)都需要类来实现,Serializable只要这些类的实例存储为HttpSession. 这是因为HttpSession当 servlet 容器需要关闭/重新启动或放置在必须同步会话的服务器集群中时,可能需要将其保存在本地磁盘文件系统上,甚至通过网络传输。

为了能够将 Java 对象保存在本地磁盘文件系统上或通过网络传输它们,必须首先将它们转换为字节流(基本上:abyte[]或 an InputStream),并且只有当对象背后的类实现时才有可能Serializable. Serializable接口本身并没有真正做任何事情,它只是一个标记接口。后面的代码只是instanceof Serializable对会话属性进行检查以采取相应的行动。

也可以看看:

于 2012-07-27T16:49:52.197 回答
3

你需要使bean.ProjectAreaBean序列化。

于 2010-02-19T06:49:21.757 回答