(每日持续更新)jdk api之NotSerializableException基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程

一、java.io

1.38 NotSerializableException

NotSerializableException 是 Java 中的异常类,它属于 java.io 包。当试图对一个非序列化的对象进行序列化时,或者在序列化或反序列化过程中涉及不可序列化的对象时,可能会抛出这个异常。

以下是 NotSerializableException 的基本介绍:

NotSerializableException 介绍:
所有字段:
  • private static final long serialVersionUID:序列化版本 ID。

构造方法:
  • NotSerializableException() 创建一个新的 NotSerializableException 对象,其中没有详细消息。

  • NotSerializableException(String s) 使用指定的详细消息创建一个新的 NotSerializableException 对象。

方法摘要:
  • 无特定的方法,继承自父类。

简单使用例子:

以下是一个简单的例子,演示了在试图序列化一个非序列化的对象时可能会抛出 NotSerializableException

javaCopy code
import java.io.*;
​
public class NotSerializableExceptionExample {
​public static void main(String[] args) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("data.bin"))) {
​// 尝试序列化一个非序列化的对象,抛出 NotSerializableExceptionNonSerializableObject nonSerializableObject = new NonSerializableObject();outputStream.writeObject(nonSerializableObject);
​} catch (IOException e) {if (e instanceof NotSerializableException) {System.err.println("NotSerializableException: Object is not serializable.");} else {e.printStackTrace();}}}
​static class NonSerializableObject {private String data;
​public NonSerializableObject() {this.data = "This object is not serializable.";}}
}

在这个例子中,我们创建了一个 NonSerializableObject 类,该类没有实现 Serializable 接口。然后,我们尝试使用 ObjectOutputStream 对这个非序列化的对象进行序列化,这时会抛出 NotSerializableException。在实际项目中,确保需要序列化的对象实现 Serializable 接口是非常重要的。

应用场景

NotSerializableException 的主要应用场景是在序列化或反序列化过程中,当试图对一个非序列化的对象进行序列化时,或者涉及不可序列化的对象时,抛出这个异常。以下是一些可能的应用场景及相应的代码实现:

应用场景 1: 序列化过程中抛出 NotSerializableException
javaCopy code
import java.io.*;
​
public class NotSerializableExceptionExample {
​public static void main(String[] args) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("data.bin"))) {
​// 尝试序列化一个非序列化的对象,抛出 NotSerializableExceptionNonSerializableObject nonSerializableObject = new NonSerializableObject();outputStream.writeObject(nonSerializableObject);
​} catch (IOException e) {if (e instanceof NotSerializableException) {System.err.println("NotSerializableException: Object is not serializable.");} else {e.printStackTrace();}}}
​static class NonSerializableObject {private String data;
​public NonSerializableObject() {this.data = "This object is not serializable.";}}
}

在这个例子中,NonSerializableObject 类没有实现 Serializable 接口,因此尝试对其进行序列化时会抛出 NotSerializableException

应用场景 2: 处理反序列化时的 NotSerializableException
javaCopy code
import java.io.*;
​
public class NotSerializableExceptionDeserializationExample {
​public static void main(String[] args) {String fileName = "data.bin";
​// 模拟从文件加载对象loadObjectFromFile(fileName);}
​private static void loadObjectFromFile(String fileName) {try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {try {// 尝试反序列化对象,处理可能的 NotSerializableExceptionObject object = inputStream.readObject();System.out.println("Deserialization successful: " + object);} catch (ClassNotFoundException | NotSerializableException e) {if (e instanceof NotSerializableException) {System.err.println("NotSerializableException: Object is not serializable during deserialization.");} else {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,loadObjectFromFile 方法尝试从文件中加载对象,如果文件包含不可序列化的对象,则会抛出 NotSerializableException。在实际项目中,处理这种异常通常需要更复杂的逻辑,例如记录日志或提供用户友好的错误消息。

请注意,确保需要序列化的对象实现 Serializable 接口是预防 NotSerializableException 的一种有效方式。

实战例子

在实际项目中,NotSerializableException 主要涉及到对象的序列化和反序列化操作。以下是一个简单的项目实战例子,演示了在保存和加载用户数据时可能会遇到 NotSerializableException 的情况:

项目实战例子:保存和加载用户数据

假设你的项目需要保存和加载用户数据,你可能会创建一个 User 类来表示用户信息。在保存用户数据时,如果某些字段不可序列化,可能会引发 NotSerializableException。以下是一个示例:

javaCopy code
import java.io.*;
​
public class UserSerializationProject {
​public static void main(String[] args) {String fileName = "users.ser";
​// 模拟保存用户数据到文件saveUsersToFile(fileName);
​// 模拟从文件加载用户数据loadUsersFromFile(fileName);}
​private static void saveUsersToFile(String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {User user1 = new User("John", 25);User user2 = new User("Alice", 30);
​outputStream.writeObject(user1);outputStream.writeObject(user2);
​System.out.println("Users saved to file successfully.");} catch (IOException e) {if (e instanceof NotSerializableException) {System.err.println("NotSerializableException: Object is not serializable.");} else {e.printStackTrace();}}}
​private static void loadUsersFromFile(String fileName) {try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {try {while (true) {User user = (User) inputStream.readObject();System.out.println("Loaded user: " + user);}} catch (ClassNotFoundException | NotSerializableException e) {if (e instanceof NotSerializableException) {System.err.println("NotSerializableException: Object is not serializable during deserialization.");} else {e.printStackTrace();}}} catch (IOException e) {if (e instanceof EOFException) {System.out.println("End of file reached.");} else {e.printStackTrace();}}}
​static class User implements Serializable {private String name;private transient int age; // transient 关键字标记 age 字段不参与序列化
​public User(String name, int age) {this.name = name;this.age = age;}
​@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}}
}

在这个例子中,User 类实现了 Serializable 接口,但 age 字段被标记为 transient,表示该字段不参与序列化。当我们尝试保存 User 对象到文件时,NotSerializableException 不会被抛出。然而,在加载用户数据时,由于 age 字段不可序列化,会触发 NotSerializableException

在实际项目中,你可能需要更复杂的数据处理逻辑以及更强大的异常处理机制,例如记录日志或提供用户友好的错误信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250364.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 流式读取 Debezium CDC 数据写入 Hudi 表无法处理 -D / Delete 消息

问题场景是:使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 (Avro 格式)接入到 Kafka 之后,通过 Flink 读取并解析这些 CDC 数据,然后以流式方式写入到 Hudi 表中,测试中发现…

【爬虫专区】批量下载PDF (无反爬)

天命:只要没反爬,一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构,很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可,其实没啥难度的 imp…

如何安装MySQL

如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中,我们将学习如何为初学者下载和安装 MySQL。 前…

安卓相对布局RelativeLayout

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"150dp"><TextViewandroid…

在VM虚拟机搭建NFS服务器

NFS共享要求如下&#xff1a; &#xff08;1&#xff09;共享“/mnt/自已姓名的完整汉语拼音”目录&#xff0c;允许XXX网段的计算机访问该共享目录&#xff0c;可进行读写操作。&#xff08;说明&#xff1a;XXX网段&#xff0c;请根据你的规划&#xff0c;再具体指定&#xf…

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑&#xff1a; 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑&#xff1a; 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…

unity3d的海盗王白银城演示

这是一个外网上的下载的海盗王unity3d制作的白银城演示场景。 地图只含有白银城区&#xff0c;没有野外和怪物。 当然也没有服务器端的。 我对灯光、摄像头、天空背景等做过调整&#xff0c;使它显示起来比较鲜丽。 它的模型和贴图是直接拿了海盗的&#xff0c;没有做过优化调整…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…

麒麟系统—— openKylin 安装 Maven

麒麟系统—— openKylin 安装 Maven 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕 二、下载Maven三、解压 Maven 与环境配置解压配置环境变量验证 最终&#xff1a;介绍配置的其他参数使用 本文将分享如何在麒麟操作系统 openKylin 上安装…

【Spring源码分析】推断构造方法

推断构造方法源码解析 一、确认候选构造——AutowireAnnotationBeanPostProcessor#determineCandidateConstructors二、autowireConstructor 方法源码解析三、总结 阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的宠物领养管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统&#xff1a;游客打开系统…

机器学习入门-----sklearn

机器学习基础了解 概念 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 定义:从数据中自动分析获得模型,并利用模型对特征数据【数据集:特征值+目标值构成】进行预测 算法 数据集的目标值是类别的话叫做分类问题;目标值是连续的数值的话叫做回…

FullStack之Django(1)开发环境配置

FullStack之Django(1)开发环境配置 author: Once Day date&#xff1a;2022年2月11日/2024年1月27日 漫漫长路&#xff0c;才刚刚开始… 全系列文档请查看专栏: FullStack开发_Once_day的博客-CSDN博客Django开发_Once_day的博客-CSDN博客 具体参考文档: The web framewor…

Docker中配置MySql环境

目录 一、简单安装 1. 首先从Docker Hub中拉取镜像 2. 启动尝试创建MySQL容器&#xff0c;并设置挂载卷。 3. 查看mysql8这个容器是否启动成功 4. 如果已经成功启动&#xff0c;进入容器中简单测试 4.1 进入容器 4.2 登录mysql中 4.3 进行简单添加查找测试 二、主从复…

C++函数分文件编写之VScode版

VScode实现函数的分文件编写 1.下载插件创建项目2.分文件编写内容3.修改主函数文件名 我在分享内容时经常用的软件是VScode&#xff0c;相信有些内存敏感或需要VScode便利性的小伙伴也是更愿意使用VScode。那么接下来我们就盘一盘怎样使用VScode实现分文件编写。 1.下载插件创建…

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll 2024/2/2 10:48 https://blog.csdn.net/feinifi/article/details/132548556 Could not locate cudnn_ops_infer64_8.dll. Please make sure it is in your library path!解决办法 安装cuDNN c:\faster-whisper-…

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 下面是用HTML5 JavaScript实现下雪效果示例&#xff0c;展示了如何使用 HTML5 的 <canvas> 元素以及 JavaScript 来创建下雪效果。效果如下&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"en">…

【Vue3】源码探索之旅:compiler-core之parseChildren函数(二)

简言 parseChildren函数是在baseParse函数中作为createRoot函数的子节点参数传入的&#xff0c;今天来探索下parseChildren函数。 parseChildren在 compiler-core/src/parse.ts文件内。 parseChildren 这个函数就是用来解析模板字符串内容的 &#xff0c;里面有个while循环…