修复 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();
}
}