迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

修复 Java 异常 Java.IO.NotSerializableException

作者:迹忆客 最近更新:2023/07/06 浏览次数:

今天,我们将在用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();
    }
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

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 异常 Java.Lang.IllegalMonitorStateException

发布时间:2023/07/16 浏览次数:176 分类:Java

IllegalMonitorStateException 与多线程编程有关。 本篇文章描述并演示了 Java 中的 IllegalMonitorStateException。Java 中的 java.lang.IllegalMonitorStateException 在 Java 中使用多线程编程时会发生 IllegalMonitorStateExce

Java 异常 java.lang.AbstractMethodError

发布时间:2023/07/14 浏览次数:256 分类:Java

本文将帮助您了解 java.lang.AbstractMethodError 以及如何在 Java 中解决它们。修复 Java 中的 java.lang.AbstractMethodError 错误 有时,我们的程序在运行时可能会遇到 AbstractMethodError。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便