今天,我们将在用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
为什么我们会面临这样的情况? 下面我们就来了解一下该错误,找出其原因。
了解 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 的原因。
我们可以使用以下解决方案修复 Java 中的 java.io.NotSerializedException。
这是因为声明为瞬态的类的字段将被可序列化运行时忽略,并且我们不会得到任何异常。
在我们的例子中,实现 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();
}
}