Serializable 序列化详解

文章目录

  • 一、什么是序列化
  • 二、Serializable 简介
  • 三、Serializable 序列化测试
  • 四、serialVersionUID 的作用
  • 五、serialVersionUID 默认 1L 和 64 位的哈希字段有什么区别?
  • 六、static 和 transient 字段


一、什么是序列化

序列化就是将对象属性转变为二进制数据。用于存储在磁盘中,或在网络上进行传输。

与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。

二、Serializable 简介

实现 java.io.Serializable 接口的类是可序列化的,这个序列化接口没有任何方法,仅作为可序列化的标识。当我们让实体类实现 Serializable 接口时,其实是在告诉 JVM 此类可被序列化,可被默认的序列化机制序列化。 没有实现此接口的类将不能使它们的任意状态被序列化或反序列化。

public interface Serializable { }

三、Serializable 序列化测试

测试类:

@Data
public class User {private String name;private Integer age;
}
public class Test {public static void main(String[] args) {User user = new User();user.setName("小白");user.setAge(18);// 把对象写到文件中try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.txt"))){oos.writeObject(user);} catch (IOException e) {e.printStackTrace();}// 从文件中读出对象try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("user.txt")))){User userRead = (User) ois.readObject();System.out.println(userRead);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

由于 User没有实现 Serializable 接口,所以 ObjectOutputStream.writeObject( ) 方法会报序列化异常。

其部分源码如下:

// remaining cases
if (obj instanceof String) {writeString((String) obj, unshared);
} else if (cl.isArray()) {writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {writeOrdinaryObject(obj, desc, unshared);
} else {if (extendedDebugInfo) {throw new NotSerializableException(cl.getName() + "\n" + debugInfoStack.toString());} else {throw new NotSerializableException(cl.getName());}
}

这段代码的意思是,ObjectOutPutStream 在序列化的时候,会判断对象的类型,如果不是字符串、数组、枚举、Serializable 的实例,会抛出 NotSerializableException。

四、serialVersionUID 的作用

serialVersionUID 被称为序列化 ID,它是决定 Java 对象能否反序列化成功的重要因子。在反序列化时,Java 虚拟机会把字节流中的 serialVersionUID 与被序列化类中的 serialVersionUID 进行比较,如果相同则可以进行反序列化,否则就会抛出序列化版本不一致的异常。

五、serialVersionUID 默认 1L 和 64 位的哈希字段有什么区别?

serialVersionUID 一般有两种定义方式:

一种是默认的 1L,比如:private static final long serialVersionUID = 1L;
一种是根据机器位数、类名等来自动生成一个 64 位的哈希字段。

Java 虚拟机是否允许反序列化,不仅取决于类是否一致,还有一个非常重要的因素就是序列化 ID 是否一致。如果没有特殊需求,采用默认的序列化 ID(1L)就可以,这样可以确保代码一致时反序列化成功。

六、static 和 transient 字段

static 和 transient 修饰的字段是不会被序列化的。

因为序列化保存的是对象的状态,static 静态变量属于类的状态,因此序列化并不保存静态变量。

transient 关键字的作用是:阻止实例中那些用此关键字声明的变量持久化;当某些变量不想被序列化,同是又不适合使用static关键字声明,那么此时就需要用 transient 关键字来声明该变量。

注:对于某些类型的属性,其状态是瞬时的,这样的属性是无法保存其状态的。例如一个线程属性或需要访问IO、本地资源、网络资源等的属性,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。

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

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

相关文章

LLVM 中 的 pass 及其管理机制

概述 LLVM 编译器框架的核心概念是任务调用和执行 编译器开发者将IR分解为不同的处理对象&#xff0c;并将其处理过程实现为单独的pass类型。在编译器初始化&#xff0c;pass被实例化&#xff0c;并被添加到pass管理中 pass 管理器(pass manager) 以流水线的方式将各个独立的…

DOM 总结

DOM 总结 1. 引言 文档对象模型(DOM,Document Object Model)是一种跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM 是万维网联盟(W3C)的标准,被广泛应用于网页设计和开发中。本文将总结 DOM 的基本概念、核心功能和实际应用。 …

【安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录】

安装笔记-系列文章目录 安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 文章目录 安装笔记-系列文章目录安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 前言一、软件介绍名称&#xff1a;cifsutils主页官方介绍特点 二、安装步骤测试…

华为校招机试 - 排列组合的回文字符串(20230515)

题目描述 如果一个字符串和它反转后的字符串相同,我们称这个字符串为回文字符串。 如:"aba"是一个回文字符串,"abb"不是一个回文字符串(长度为 1 的字符串也是回文字符串)。 要给定一个字符串,其长度范围为:[1, 1000),返回其通过重新排列组合后…

exit和_exit函数和atexit函数

相对于return函数&#xff0c;exit和_exit是用于专门退出进程的函数&#xff0c;而return不是用于专门退出进程的&#xff0c;只是执行mian函数时&#xff0c;return可以退出进程。&#xff08;return退出当前函数执行的栈空间&#xff0c;并返回当前函数执行的结果&#xff09…

基于JSP技术的个人网站系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP JavaBeans Servlet 工具&#xff1a;Eclipse、MySQL Workbench、…

.net8 blazor auto模式很爽(五)读取sqlite并显示(2)

在BlazorApp1增加文件夹data&#xff0c;里面增加类dbcont using SharedLibrary.Models; using System.Collections.Generic; using Microsoft.EntityFrameworkCore;namespace BlazorApp1.data {public class dbcont : DbContext{public dbcont(DbContextOptions<dbcont>…

Java高频面试题整理(几万字)

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

卷积网络热图显示

【卷积神经网络可视化】之热度图可视化_visualizing heatmaps of class activation in an ima-CSDN博客

Java中的Stream API及其应用

Java中的Stream API及其应用 Java 8引入了Stream API,这是对集合进行复杂操作的强大工具。Stream API支持函数式编程风格,能够简洁、清晰地处理集合数据。本文将详细介绍Java中的Stream API及其实际应用场景。 一、Stream API简介 Stream是元素的序列,这些元素支持顺序和…

ctfshow-web入门-命令执行(web43-web52)关于黑洞“ >/dev/null 2>1“的处理与绕过

目录 1、web43 2、web44 3、web45 4、web46 5、web47 6、web48 7、web49 8、web50 9、web51 10、web52 1、web43 在上一题 ‘黑洞’ 的基础上新增过滤&#xff1a; preg_match("/\;|cat/i", $c) 问题不大&#xff0c;我们不用分号和 cat 就行&#xff1a;…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式

GRAM的灵感来自于Kolmogorov-Arnold网络&#xff08;KAN&#xff09;的替代品&#xff0c;如TorchKAN和ChebyKAN。GRAM引入了一种KAN模型的简化版本&#xff0c;但利用了Gram多项式变换的简洁性。它与其他替代品的不同之处在于其独特的离散性特征。与其他在连续区间上定义的多项…

串口触摸屏的键盘控制

&#xff08;text 属性txt_maxl 800&#xff09; ①变量loadpageid.val&#xff1a;调用页的页面ID。 ②变量loadcmpid.val&#xff1a;调用页的控件ID。 ③定时器tm0&#xff1a;让输入框有个光标不断闪烁&#xff0c;如果不需要&#xff0c;控件属性en0即可。 ④变量inputlen…

Redis Cluster 为什么不支持传统的事务模型

Redis Cluster 采用了分布式的架构&#xff0c;其设计目标主要是为了提供高可用性和可伸缩性。Redis Cluster 的数据分片存储在不同的节点上&#xff0c;每个节点负责一部分数据。传统的 Redis 单节点事务是通过 MULTI/EXEC 命令实现的&#xff0c;但 Redis Cluster 不支持跨节…

【python操作Excel的方法】

当然&#xff0c;除了openpyxl和pandas之外&#xff0c;还有其他几种方法可以用来操作Excel文件。以下是一些常见的操作Excel的方法&#xff0c;并附带了相关的数字和信息&#xff08;基于提供的参考文章&#xff09;&#xff1a; 1. 使用Excel本身的宏和VBA 优势&#xff1a…

centos意外断电的情况下linux挂载磁盘报错(已解决)

问题描述 centos意外断电的情况下linux挂载磁盘报错&#xff0c;这大致是意外断电硬盘相关meta信息还未落盘之类的导致磁盘信息对不上 通过命令 kubectl describe pod minio-5b9765594b-g4bwt得到错误信息 Warning FailedMount 47m (x5 over 47m) kubelet MountVolume.Mount…

切片(slicing)(Python)

文章目录 前言一、基本语法二、基本操作1、字符串2、列表 前言 切片&#xff08;Slicing&#xff09;是Python中对于序列类型&#xff08;如字符串、列表、字节、元组等&#xff09;的一种操作&#xff0c;用于获取序列的子部分。 一、基本语法 sequence[start:stop:step]参数…

SEO优化笔记 个人博客如何SEO设置

说实话现在个人博客越来越难做了&#xff0c;因为现在大多数的流量都被短视频吸引去了&#xff0c;当然有很多个人博客作的非常的好&#xff0c;还是有很多的流量做支撑的&#xff0c;个人也是小白站长&#xff0c;折腾网站也很久了&#xff0c;也总结了几点&#xff0c;分享非…

ABI和API的区别

ABI和API的区别 ABI&#xff08;Application Binary Interface&#xff09;&#xff1a; ABI是一种定义了二进制接口规范的概念&#xff0c;用于描述不同模块之间如何进行二进制交互。它定义了函数调用约定、参数传递方式、寄存器使用、内存布局等底层细节。ABI的目标是确保不…

C++风流和MATLAB | Python | CUDA 库埃特流泊肃叶流薄膜流体

&#x1f3af;要点 &#x1f3af;无滑移速度边界条件&#xff1a;&#x1f58a;反弹法计算库埃特流、泊肃叶流 | &#x1f58a;湿节点法计算库埃特流、泊肃叶流 | &#x1f3af;力模型&#xff1a;&#x1f58a;反弹法和不同的格子玻尔兹曼体力模型计算泊肃叶流 | &#x1f58…