修复 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的原因

了解 NotSerializedExceptionSerialization 来查找原因至关重要。

序列化是 Java 编程中的一种机制,我们用它来将对象的状态写入字节流。 与之相反,它的逆操作称为反序列化。

序列化和反序列化是平台无关的。 这意味着这两个过程可以在不同的平台上执行。

我们在远程方法调用 (RMI) 和 Enterprise Java Beans (EJB) 中使用序列化。 它还用于 Java Persistence API (JPA)、Hibernate 等。

NotSerializedException 是扩展 ObjectStreamException 类的异常,定义为特定于 Object Stream 类的所有其他异常的超类。

此外,ObjectStreamException 扩展了 IOException,它进一步表明已生成 I/O 异常。

现在,我们知道了Java中的 SerializationNotSerializedException。 这次讨论带我们去发现 Java中NotSerializedException 的原因。

  1. 当类的实例必须实现 Serialized 接口时,会发生 NotSerializedException。
  2. 我们还可以通过类的实例或序列化运行时来获取此异常。 请记住,NotSerializedException 的参数是类的名称。
  3. 根据文档,完整的对象图需要可序列化。 如果在尝试序列化类的实例时至少有一个字段未实现 Serialized 接口,也会发生 NotSerializedException。

修复 Java 中的 java.io.NotSerializedException

我们可以使用以下解决方案修复 Java 中的 java.io.NotSerializedException。

  1. 找到抛出此异常的类,并通过实现 Serialized 接口使其可序列化。 请记住,如果引发 NotSerializedException 的类属于第三方库,则此解决方案可能不是一个好的选择。
  2. 如果该类引用了不可序列化的对象(其中这些对象不得可序列化),则我们可以将对象声明为瞬态对象。 问题是,为什么将其声明为瞬态?

    这是因为声明为瞬态的类的字段将被可序列化运行时忽略,并且我们不会得到任何异常。

  3. 如果我们需要它的数据和它的第三方,我们可以考虑其他的序列化方式。 例如,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,python,开发语言)