迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 中处理整数上溢和下溢

发布时间:2023/07/10 浏览次数:102 分类:Java

本文介绍整数数据类型的上溢和下溢以及该问题的处理。Java 中整数上溢和下溢概述 如果您使用整数值,则可能会遇到上溢或下溢错误。

理解 Java 中的 java.lang.reflect.InvocationTargetException 错误

发布时间:2023/07/10 浏览次数:197 分类:Java

在本文中,我们将了解 Java 中的 java.lang.reflect.InitationTargetException。Java 中的 java.lang.reflect.InitationTargetException 错误 当开发人员使用 Java Reflection API 时,java.lang.reflect.InitationTargetException 是一个非

Java 中 ExceptionInInitializer 错误

发布时间:2023/07/10 浏览次数:121 分类:Java

在这篇文章中,我们将了解Java中的 ExceptionInInitializerError。Java中 ExceptionInInitializerError 简介 ExceptionInInitializerError 是 Java 中的未经检查的异常,它是 Error 类的子类。 它属于运行时异常的类别。

Java 中 GC Overhead Limit Exceeded 错误

发布时间:2023/07/10 浏览次数:127 分类:Java

本文将讨论 Java 中的 GC 开销超出限制错误。Java中GC Overhead Limit Exceeded错误简介 在Java中,当程序不再使用对象时,JVM(Java虚拟机)会释放内存。

Java 中的纸牌洗牌

发布时间:2023/05/16 浏览次数:73 分类:Java

本文介绍如何在 Java 中洗一副牌。使用 Java 中的传统循环打乱 ArrayList。类似地,在 Java 中,各种方法允许用户随机播放元素。下面是演示此过程的代码块。

Java 中将列表转换为 ArrayList

发布时间:2023/05/16 浏览次数:156 分类:Java

在 Java 中将 List 转换为 ArrayList 的方法。在本篇文章中,我们讨论了如何在 Java 中将列表转换为 ArrayList。

Java 中 ArrayList 和 LinkedList 的区别

发布时间:2023/05/16 浏览次数:126 分类:Java

本文介绍 Java 中 ArrayList 和 LinkedList 的区别。ArrayList 和 LinkedList 都用于存储数据,但由于实现类型的不同而存在一些差异。

在 Java 中将 ArrayList 转换为 Set

发布时间:2023/05/16 浏览次数:193 分类:Java

本文介绍 Java 中 ArrayList 到 Set 的转换。ArrayList 是 List 接口的实现类,用于以线性顺序存储数据,而 set 是具有 HashSet 类来存储数据的接口。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便