修复 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();
}
}
相关文章
Java 异常 Java.IO.StreamCorruptedException: Invalid Stream Header
发布时间:2023/07/16 浏览次数:1181 分类:Java
-
本文介绍如何修复Java的 java.io.StreamCorruptedException: invalid stream header 异常。Java 中的 java.io.StreamCorruptedException: invalid stream header java.io.StreamCorruptedException: invalid stream header 是相对常见的异常。
Java 异常 Java.IO.IOException: Connection Reset by Peer
发布时间:2023/07/16 浏览次数:1586 分类:Java
-
本篇文章介绍 Java 的 java.io.IOException: Connection reset by peer。Java 中 java.io.IOException: Connection reset by peer IOException 表示读取或写入文件或访问文件系统时可能发生的任何输入输出异常。
Java 异常 Exception in Thread AWT-EventQueue-0 java.lang.NullPointerException
发布时间:2023/07/16 浏览次数:983 分类:Java
-
当我们使用 Java AWT 包方法并且将 null 值传递给任何方法时,会发生 “AWT-EventQueue-0”java.lang.NullPointerException 异常。 本教程演示如何在 Java 中解决此 NullPointerException。Java 中线程“AWT-EventQueue-0”
Java 异常 Java.Lang.IllegalMonitorStateException
发布时间:2023/07/16 浏览次数:176 分类:Java
-
IllegalMonitorStateException 与多线程编程有关。 本篇文章描述并演示了 Java 中的 IllegalMonitorStateException。Java 中的 java.lang.IllegalMonitorStateException 在 Java 中使用多线程编程时会发生 IllegalMonitorStateExce
Java 异常 Exception in Thread Main Java.Util.NoSuchElementException: No Line Fo
发布时间:2023/07/16 浏览次数:486 分类:Java
-
本篇文章介绍如何解决Java中的异常 Exception in thread "main" java.util.NoSuchElementException: No line found。java.util.NoSuchElementException 是运行时未经检查的异常
Java 异常 Java.Lang.ClassNotFoundeException: Sun.Jdbc.Odbc.JdbcOdbcDriver
发布时间:2023/07/15 浏览次数:421 分类:Java
-
本篇文章介绍了 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 错误。修复 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
Java 异常 Java.Lang.ClassNotFoundException: Org.SpringFramework.Web.Servlet.Dis
发布时间:2023/07/15 浏览次数:323 分类:Java
-
今天关于 Java 的文章将介绍错误 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。什么是 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
解决 Java 异常 Unable to Instantiate org.apache.hadoop.hive.ql.metadata.Sessi
发布时间:2023/07/14 浏览次数:251 分类:Java
-
本篇文章介绍如何解决 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient。Apache Hive 是一款开源数据仓库软件,用于读取、管理和写入存储在 Hadoop 文件中的大
Java 异常 java.lang.AbstractMethodError
发布时间:2023/07/14 浏览次数:256 分类:Java
-
本文将帮助您了解 java.lang.AbstractMethodError 以及如何在 Java 中解决它们。修复 Java 中的 java.lang.AbstractMethodError 错误 有时,我们的程序在运行时可能会遇到 AbstractMethodError。