首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.WriteAbortedException:写入已中止;java.io.NotSerializableException

java.io.WriteAbortedException:写入已中止;java.io.NotSerializableException
EN

Stack Overflow用户
提问于 2010-02-19 14:46:48
回答 2查看 69.8K关注 0票数 25

是什么导致了Tomcat中的这种错误?

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2012-07-28 00:49:52

只需实现Serializable

如果您得到如下所示的NotSerializableException

代码语言:javascript
复制
java.io.NotSerializableException: bean.ProjectAreaBean

然后,这只是意味着由异常消息中的完全限定名标识的类(在您的示例中是bean.ProjectAreaBean )没有实现Serializable接口,而它是后面的代码所期望的。修复它相对简单,只需让类实现Serializable接口即可。

代码语言:javascript
复制
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 (通常,这些字段/属性表示资源,如InputStreamConnection等),那么您需要将其标记为transient。这样,它将在类的序列化过程中被跳过。

代码语言:javascript
复制
private transient SomeObject thisWillNotBeSerialized;

您需要了解,在反序列化之后,此字段将始终变为null。注意,类的构造函数和初始化块是在反序列化过程中调用的,而不是。如果您希望对序列化和反序列化进行更细粒度的控制,那么可以覆盖readObject()writeObject()方法。你可以在下面的链接中找到具体的例子:

为什么要序列化?

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

为了能够将Java对象保存在本地磁盘文件系统上或通过网络传输它们,必须首先将它们转换为字节流(基本上是:byte[]InputStream),这只有在对象后面的类实现Serializable时才可能实现。Serializable接口本身并不能做任何事情,它只是一个。后面的代码仅对会话属性执行instanceof Serializable检查,以执行相应的操作。

另请参阅:

  • java.io.Serializable javadoc
  • Java Object Serialization Specification
  • Java Tutorials - Essential Classes - Basic I/O - Object Streams
票数 60
EN

Stack Overflow用户

发布于 2010-02-19 14:49:22

您需要使bean.ProjectAreaBean可序列化。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2294551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档