修复 Java 异常 Java.IO.NotSerializableException
今天,我们将在用Java编写程序时重现 java.io.NotSerializedException
。 我们还将了解该错误的含义、导致其原因和解决方案。
在Java中重现java.io.NotSerializedException
示例代码(Student.java 文件):
package com.serializertest;
class Student {
private String studentId;
public String getId() {
return studentId;
}
public void setId(String id) {
this.studentId = id;
}
}
Student
类是一个辅助类,它有一个名为 StudentId 的成员变量。 它还具有名为 getId()
和 setId()
的成员方法来获取和设置学生的 id。
示例代码(SerializerTest.java 文件):
package com.serializertest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializerTest {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
Student student = new Student();
student.setId("0001");
objectOutputStream.writeObject(student);
objectOutputStream.close();
}
}
SerializerTest 是我们的主类,其中有 main() 驱动程序方法。 在 main()
内部,我们创建 FileOutputStream 类的实例来创建文件。
同样,我们创建 ObjectOutputStream 类的另一个实例。
然后,我们创建一个 Student 类的对象,并通过传递一个字符串参数来调用它的 setId()
方法。 接下来,我们使用 ObjectOutputStream 类的对象将对象写入流中。
为此,我们使用 writeObject()
方法。
之后,我们使用 close()
方法关闭流并运行程序,但它在程序的输出控制台中给出了以下异常。
Exception in thread "main" java.io.NotSerializableException: com.serializertest.Student
为什么我们会面临这样的情况? 下面我们就来了解一下该错误,找出其原因。
Java中java.io.NotSerializedException的原因
了解 NotSerializedException 和 Serialization 来查找原因至关重要。
序列化是 Java 编程中的一种机制,我们用它来将对象的状态写入字节流。 与之相反,它的逆操作称为反序列化。
序列化和反序列化是平台无关的。 这意味着这两个过程可以在不同的平台上执行。
我们在远程方法调用 (RMI) 和 Enterprise Java Beans (EJB) 中使用序列化。 它还用于 Java Persistence API (JPA)、Hibernate 等。
NotSerializedException 是扩展 ObjectStreamException 类的异常,定义为特定于 Object Stream 类的所有其他异常的超类。
此外,ObjectStreamException 扩展了 IOException,它进一步表明已生成 I/O 异常。
现在,我们知道了Java中的 Serialization 和 NotSerializedException。 这次讨论带我们去发现 Java中NotSerializedException 的原因。
- 当类的实例必须实现 Serialized 接口时,会发生 NotSerializedException。
- 我们还可以通过类的实例或序列化运行时来获取此异常。 请记住,NotSerializedException 的参数是类的名称。
- 根据文档,完整的对象图需要可序列化。 如果在尝试序列化类的实例时至少有一个字段未实现 Serialized 接口,也会发生 NotSerializedException。
修复 Java 中的 java.io.NotSerializedException
我们可以使用以下解决方案修复 Java 中的 java.io.NotSerializedException。
- 找到抛出此异常的类,并通过实现 Serialized 接口使其可序列化。 请记住,如果引发 NotSerializedException 的类属于第三方库,则此解决方案可能不是一个好的选择。
-
如果该类引用了不可序列化的对象(其中这些对象不得可序列化),则我们可以将对象声明为瞬态对象。 问题是,为什么将其声明为瞬态?
这是因为声明为瞬态的类的字段将被可序列化运行时忽略,并且我们不会得到任何异常。
- 如果我们需要它的数据和它的第三方,我们可以考虑其他的序列化方式。 例如,XML、JSON等,我们可以在不改变其定义的情况下序列化第三方对象。
在我们的例子中,实现 Serialized 修复了 java.io.NotSerializedException
。 请参阅以下示例代码。
示例代码 (Students.java 文件):
package com.serializertest;
import java.io.Serializable;
class Student implements Serializable{
private String studentId;
public String getId() {
return studentId;
}
public void setId(String id) {
this.studentId = id;
}
}
示例代码 (SerializerTest.java 文件):
package com.serializertest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializerTest {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
Student student = new Student();
student.setId("0001");
objectOutputStream.writeObject(student);
objectOutputStream.close();
}
}
相关文章
Minecraft 上 An Existing Connection Was Forcibly Closed by the Remote Host 错误
发布时间:2023/07/10 浏览次数:103 分类:Java
-
本篇文章介绍了使用 Minecraft 时出现远程主机错误强制关闭现有连接的原因和解决方案。Minecraft 上 Java.IO.IOException: An Existing Connection Was Forcibly Closed by the Remote Host 原因
在 Java 中处理整数上溢和下溢
发布时间:2023/07/10 浏览次数:102 分类:Java
-
本文介绍整数数据类型的上溢和下溢以及该问题的处理。Java 中整数上溢和下溢概述 如果您使用整数值,则可能会遇到上溢或下溢错误。
理解 Java 中的 java.lang.reflect.InvocationTargetException 错误
发布时间:2023/07/10 浏览次数:197 分类:Java
-
在本文中,我们将了解 Java 中的 java.lang.reflect.InitationTargetException。Java 中的 java.lang.reflect.InitationTargetException 错误 当开发人员使用 Java Reflection API 时,java.lang.reflect.InitationTargetException 是一个非
Java 中 ExceptionInInitializer 错误
发布时间:2023/07/10 浏览次数:121 分类:Java
-
在这篇文章中,我们将了解Java中的 ExceptionInInitializerError。Java中 ExceptionInInitializerError 简介 ExceptionInInitializerError 是 Java 中的未经检查的异常,它是 Error 类的子类。 它属于运行时异常的类别。
Java 中 GC Overhead Limit Exceeded 错误
发布时间:2023/07/10 浏览次数:127 分类:Java
-
本文将讨论 Java 中的 GC 开销超出限制错误。Java中GC Overhead Limit Exceeded错误简介 在Java中,当程序不再使用对象时,JVM(Java虚拟机)会释放内存。
Java 中的纸牌洗牌
发布时间:2023/05/16 浏览次数:73 分类:Java
-
本文介绍如何在 Java 中洗一副牌。使用 Java 中的传统循环打乱 ArrayList。类似地,在 Java 中,各种方法允许用户随机播放元素。下面是演示此过程的代码块。
Java 中将列表转换为 ArrayList
发布时间:2023/05/16 浏览次数:156 分类:Java
-
在 Java 中将 List 转换为 ArrayList 的方法。在本篇文章中,我们讨论了如何在 Java 中将列表转换为 ArrayList。
Java 中 ArrayList 和 LinkedList 的区别
发布时间:2023/05/16 浏览次数:126 分类:Java
-
本文介绍 Java 中 ArrayList 和 LinkedList 的区别。ArrayList 和 LinkedList 都用于存储数据,但由于实现类型的不同而存在一些差异。
在 Java 中将 ArrayList 转换为 Set
发布时间:2023/05/16 浏览次数:193 分类:Java
-
本文介绍 Java 中 ArrayList 到 Set 的转换。ArrayList 是 List 接口的实现类,用于以线性顺序存储数据,而 set 是具有 HashSet 类来存储数据的接口。