Java中的实体类为什么要 implements Serializable?

news2024/11/24 15:57:43

1. 序列化和反序列化

首先来解释一下什么是序列化和反序列化:

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

  • 在 Java 和其他语言进行通信的时候,需要将对象转化成一种通用的格式例如Json( 转换成大家都认识的对象 ),从对象到 Json 字符串的转换过程就是序列化的过程,反过来, 从 Json 字符串转换成 Java 对象的过程就是反序列化的过程。
  • 当 Java 需要把一个对象的状态保存到文件或者是数据库的时候,就是数据存取的过程中的中间过程,就需要序列化。我们可以把序列化的过程理解为 "freeze",它将一个 Java 对象 freeze,然后进行存储;等到再次需要的时候,再将这个对象 "de-freeze" 就能使用了。

2. 为什么要 implements Serialzable?

  • 一个类只有实现了 Serializable 接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现 Serializable 接口。而实际上,Serializable 的源码是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
  • serialization 允许你将实现了 Serializable 接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。

3. 那么什么情况下需要实现序列化?

  • 把内存中的对象写入到硬盘。例如,你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。再例如,你要将某个特定的对象保存到文件中,隔几天在把它拿出来用,那么这时候就需要实现 Serializable 接口。
  • 使用套接字在网络上传送对象,通常情况下你可以在 server 端用获取 socket 的 outputstream inputstream,将取得的数据处理成字符串发送到客户端,然后在客户端拆分字符串,但是这样显然会降低效率,于是你可以将 server 端数据 包装 成一个 class implements Serializable,然后直接用objectoutputstream,objectinputstream 直接传递。
  • 通过 Java的 RIM(remote method invocation)传输对象。RMI 允许对象在本机上可以一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到 serializaiton 机制来发送参数和接收返回值。

实体类实现序列化的目的:

  • 一是便于存储
  • 二是便于传输

像 boolean 、int、long 类型等,都是基本数据类型,数据库里面有与之对应的数据结构。从类声明来看,我们以为的没有进行序列化,其实是在声明各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。所以就算我们不实现 serializable 依旧可以正常操作。

如果平时留意的话,我们会发现序列化操作用于存储时,一般是对于 NoSql 数据库,而在使用 Nosql 数据库进行存储时,如 redis,它就没有 varchar,int 之类的数据结构。 而在没有的情况下,我们又确实需要进行存储,那么我们就需要将对象进行序列化。

4. 为什么要显示声明 serialVersionUID

serialVersionUID 的作用是验证序列化和反序列化的过程中,对象是否保持一致。所以在一般情况下我们需要显示的声明serialVersionUID。如果接受者加载的该对象的类的 serialVersionUID 和发送者的类版本号不同的话,反序列化会爆出 InvalidClassException 错误。

什么时候会导致报出这个错误呢?例如在没有显示声明版本号的时候,先将对象进行了序列化;然后不管出于什么目的,该对象的类被修改了,哪怕仅仅是添加了一个强制转换,或者将一个 public 的属性给私有化了,都会影响版本号。此时在这个环境下用反序列化的方法读取以前序列化之后存储起来的对象是会报错的。

@Data
public class Student implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    @TableId("id")
    private Integer id;
 
    @TableField("name")
    private String name;
 
    @TableField("age")
    private Integer age;
}

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

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

相关文章

安卓手机ROOT和刷机基本操作——以红米Note7刷安卓原生系统并Root为例

文章目录 前言一.简介1. 安卓权限2. 安卓分区Boot分区System分区Data分区Cache分区Recovery分区 3. Fastboot 二.前置准备1. Android SDK 工具2. 解BL锁 三. ROOT1.Fastboot线刷(推荐)获取系统boot镜像修补boot.img刷入boot 2. Recovery卡刷(可以尝试) 四. 红米Note7刷安卓原生…

Burpsuite介绍及2022.8.2版本超详细安装教程(图文版)

Burpsuite介绍及2022.8.2版本超详细安装教程(图文版) 文章目录 Burpsuite介绍及2022.8.2版本超详细安装教程(图文版)Burpsuite是什么?Burpsuite环境配置及安装JDK选择及配置Burpsuite下载安装 Burpsuite快捷启动方式选…

卷积神经网络中池化层的详细介绍

卷积神经网络自2012年,到2023年经历了翻天覆地的变化。最早的卷积神经网络由卷积层、池化层和全连接层所构成。其中卷积层用于提取图像的特征,池化层削减特征数量,全连接层用于对特征进行非线性组合并预测类别。然而在transformer横行的年代&…

【瑞吉外卖】适合速成SpringBoot和MyBatis的作业项目

文章目录 零、MyBatisPlus一、管理端登录1.0 统一的返回结果Result类1.1 admin/login1.2 admin/logout1.3 Filter1.4 自定义消息转换器 二、员工管理2.1 新增员工-字段填充2.2 全局异常捕获2.3 员工信息分页查询 三、分类管理3.1 分类的删除 四、菜品管理4.1 文件的上传与下载1…

CNAPPs投资热度持续攀升 腾讯云被Gartner评为全球案例厂商

近日,Gartner发布《新兴技术:在三重挤压中蓬勃发展—对云安全风险投资的关键洞察》(Emerging Tech: Thriving Amid the Triple Squeeze— Critical Insights on VC Funding for Cloud Security)(以下简称《报告》&…

Flink 学习五 Flink 时间语义

Flink 学习五 Flink 时间语义 1.时间语义 在流式计算中.时间是一个影响计算结果非常重要的因素! (窗口函数,定时器等) Flink 可以根据不同的时间概念处理数据。 处理时间: process time System.currentTimeMillis()是指执行相应操作的机器系统时间(也称为纪元时间…

优化|如何减小噪声和误差对梯度下降法的影响

编者按: ​ 许多精确算法在理论上能保证我们的目标函数值一直下降。在随机梯度下降以及无导数优化等情况下,目标移动方向受到噪声干扰,与实际下降方向往往会存在偏差。本文将分析噪声和下降偏差对于梯度下降法等算法的影响,并且介…

SpringMVC08:拦截器+文件下载

目录 一、概述 二、自定义拦截器 1、新建一个Moudule,SpringMVC-07-Interceptor,添加web支持; 2、配置web.xml和springmvc-servlet.xml文件 3、编写一个拦截器 4、在springmvc的配置文件中配置拦截器 5、编写一个Controller&#xff0…

【数据库】Mysq备份与恢复

文章目录 一、数据库备份的分类1. 数据备份的重要性2. 数据库备份的分类3. 常见的备份方法 二、Mysql 完全备份与恢复1. Mysql 完全备份2. 数据库完全备份分类2.1 物理冷备份及恢复2.2 mysqldump 备份数据库完全备份一个或多个完整的库(包括其中所有的表&#xff09…

基于YOLOv5实现安全帽检测识别

目录 1、作者介绍2、YOLOv5网络模型2.1 算法简介2.2 数据集介绍2.2.1 VOC数据集准备2.2.2 YOLOv5算法检测流程 3、代码实现3.1 数据集划分部分代码3.2 训练阶段3.3 测试阶段3.4 检测结果 4、问题与分析参考链接 1、作者介绍 陈梦丹,女,西安工程大学电子…

【6.20】sleep()和wait()的区别

sleep()和wait()的区别 1、wait()方法 1.1使用场景 当某个线程获取到锁后,却还是不满足执行的条件,就可以调用对象锁的wait方法,进入等待状态。 直到外在条件满足了,就可以由其它线程调用notify或者notifyAll方法,…

在软件研发排期中要求“倒推时间”,项目结束后悲剧了……

有没有遇到某个项目任务的研发周期已被各路boss定下,研发团队都觉得时间不合理,反馈给上级无果,而要求“倒推时间”进行任务排期的情况? 什么是“倒推时间”? 目标倒推法,从剩下的时间反推算出每天该做的事…

【Java】死锁问题及ThreadLocal

什么是死锁分析过程发生死锁的原因避免死锁ThreadLocal 什么是死锁 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。这是一个最严重的BUG之一。 分析过程 1.一个线程一把锁 一个线…

深入理解TDD(测试驱动开发):提升代码质量的利器

在日常的软件开发工作中,我们常常会遇到这样的问题:如何在繁忙的项目进度中,保证我们的代码质量?如何在不断的迭代更新中,避免引入新的错误?对此,有一种有效的开发方式能帮助我们解决这些问题&a…

14.处理大数据集

14.1 随机梯度下降 假设你正在使用梯度下降来训练一个线性回归模型 当m个样本的m很大时,求和计算量太大了。这种梯度下降算法有另外一个名字叫做批量梯度下降(batch gradient desent)。这种算法每次迭代需要使用全量训练集,直到算…

【代码阅读软件】Source Insight 4 使用教程 | 很详细——适合新手

目录 一、概述二、常用的几个窗口👉2.1 符号窗口(Symbol Window)👉2.2 项目文件窗口(Project Window)👉2.3 关系窗口(Relation Window)👉2.4 上下文窗口&…

STM32--基于固件库(Library Faction)的led灯点亮

目录 一、STM32芯片的简单介绍 二、基于固件库(Library Faction)的led灯点亮 这是一个学习stm32的开端,我们由简入难,之前学过C51/52或是其他型号的一般都是从led开始,也就是简单的输入输出端口的应用。(想…

SpringBoot整合模板引擎Thymeleaf(1)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Thymeleaf概述 Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎,主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中…

【kubernetes】Etcd集群部署与验证

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

吐血整理,性能测试Jmeter分布式压测遇坑总结+解决

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 为什么要使用分布…