当前位置: 首页 > article >正文

修复 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();
    }
}

http://www.kler.cn/a/232117.html

相关文章:

  • 数据仓库在大数据处理中的作用
  • ollama+springboot ai+vue+elementUI整合
  • nginx源码安装配置ssl域名
  • C++中特殊类设计/单例模式
  • 信息收集—JS框架识别泄露提取API接口泄露FUZZ爬虫插件项目
  • Spring Cloud Eureka 服务注册与发现
  • c入门第十篇——指针入门
  • vue.js基于springboot的实验室设备管理系统10345
  • 51单片机之LED灯模块篇
  • 牛客网SQL264:查询每个日期新用户的次日留存率
  • Flink流式数据倾斜
  • 如何在 Debian 11 上安装 Python 3 并设置编程环境
  • 2023年哪个前端框架用的最多?
  • 计划任务功能优化,应用商店上架软件超过100款,1Panel开源面板v1.9.6发布
  • 华为第二批难题五:AI技术提升六面体网格生成自动化问题
  • 【深度学习:SegGPT】在上下文中分割所有内容 [解释]
  • Stable Diffusion 模型下载:RealCartoon-Pixar - V8
  • [经典问题][AC代码]玉米地(CowFood)
  • C++ STL 教程
  • 【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)
  • Java基础常见面试题总结-集合(二)
  • 数据结构 - 线索树
  • 关于 Rust程序设计语言-构建多线程 Web服务器 一章的一些问题
  • 解决CORS错误(Spring Boot)
  • C#静态数组删除数组元素不改变数组长度 vs 动态数组删除数组元素改变数组长度
  • rust嵌入式开发之RTICvsEmbassy