dev*_*ven 18 tomcat java-ee catalina java-io notserializableexception
什么原因导致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)
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 45
Serializable如果你得到一个NotSerializableException像下面的,
java.io.NotSerializableException: bean.ProjectAreaBean
Run Code Online (Sandbox Code Playgroud)
那么它只是意味着由异常消息中的完全限定名称(bean.ProjectAreaBean在您的情况下)所标识的类在Serializable后面的代码所期望的情况下不实现该接口.修复它相对简单,只需让类实现Serializable接口即可.
package bean;
import java.io.Serializable;
public class ProjectAreaBean implements Serializable {
private static final long serialVersionUID = 1L;
// ...
}
Run Code Online (Sandbox Code Playgroud)
该serialVersionUID字段不是必需的,但强烈建议这样做,因为这样可以保持类的不同版本与其实例的序列化表示之间的二进制兼容性.因此,当您稍后向类中添加一个新的可序列化字段时,您需要更改该serialVersionUID字段(通常只需将其递增1就足够了)以防止在对该类的旧版本的实例进行反序列化时出现问题.像Eclipse这样的IDE还提供了(重新)生成serialVersionUID值的选项,该值基本上是基于所有字段计算的哈希值.
transient如果你的Serializable类中又包含字段/属性引用这是绝对不能进行其他类的一个实例Serializable(通常,这些代表的资源,如InputStream,Connection等),那么你需要将其标记transient.这样,在类的序列化过程中将跳过它.
private transient SomeObject thisWillNotBeSerialized;
Run Code Online (Sandbox Code Playgroud)
您需要了解在反序列化后,此字段将始终变为null.请注意,在反序列化期间不会调用类的构造函数和初始化块.如果您希望对序列化和反序列化进行更精细的控制,则覆盖readObject()和writeObject()方法.您可以在以下链接中找到具体示例:
至于为什么你需要担心序列化,这是因为大多数的Java servlet容器如Tomcat需要类来实现Serializable,只要这些类的实例都被存储的属性HttpSession.这是因为HttpSession可能需要时servlet容器需要关闭/重启或被放置在服务器群集,其中所述会话必须被同步到被保存在本地磁盘文件系统上或甚至转移通过网络.
为了能够保存在本地磁盘文件系统上的Java对象或通过网络传送它们,它们必须被转换成字节流的第一(基本上是:一个byte[]或一个InputStream),这是唯一可能的,如果对象实现背后的类Serializable.该Serializable接口本身并没有真正做任何事情,它只是一个标记接口.后面的代码仅instanceof Serializable检查会话属性以相应地执行操作.
| 归档时间: |
|
| 查看次数: |
59364 次 |
| 最近记录: |