关于Java中的实体类要 implements Serializable的原因分析

 更新时间:2023年06月21日 11:01:11   作者:奋豆来袭  
这篇文章主要介绍了Java中的实体类为什么要 implements Serializable,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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;
}

到此这篇关于Java中的实体类为什么要 implements Serializable?的文章就介绍到这了,更多相关Java实体类 implements Serializable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析Springboot集成Tile38客户端之Set命令实现示例

    解析Springboot集成Tile38客户端之Set命令实现示例

    这篇文章主要为大家介绍了解析Springboot集成Tile38客户端之Set命令实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java使用FFmpeg提取音频的详细指南

    Java使用FFmpeg提取音频的详细指南

    FFmpeg 是一个开源的多媒体处理工具,支持视频、音频的编码、解码、转换等多种功能,本文将详细讲解如何使用 FFmpeg 提取音频,包括常见的音频格式提取、音频质量调整、高级处理操作等,内容浅显易懂,适合初学者快速掌握,需要的朋友可以参考下
    2024-11-11
  • Java RMI详细介绍及简单实例

    Java RMI详细介绍及简单实例

    这篇文章主要介绍了Java RMI详细介绍及简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • springboot+Quartz实现任务调度的示例代码

    springboot+Quartz实现任务调度的示例代码

    本篇文章主要介绍了springboot + Quartz 实现任务调度的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • JavaGUI界面实现页面跳转方法

    JavaGUI界面实现页面跳转方法

    这篇文章主要给大家介绍了关于JavaGUI界面实现页面跳转的相关资料, GUI是指图形用户界面,指采用图形方式显示的计算机操作用户界面,需要的朋友可以参考下
    2023-07-07
  • Java Swing JLabel标签的使用方法

    Java Swing JLabel标签的使用方法

    这篇文章主要介绍了Java Swing JLabel标签的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java中的泛型使用详解

    Java中的泛型使用详解

    本文给大家介绍java中的泛型知识,包括基本语法使用方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-10-10
  • Java经典设计模式之适配器模式原理与用法详解

    Java经典设计模式之适配器模式原理与用法详解

    这篇文章主要介绍了Java经典设计模式之适配器模式,简单说明了适配器模式的概念、原理,并结合实例形式分析了java适配器模式的用法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • Java之CMS和G1垃圾回收过程的异同说明

    Java之CMS和G1垃圾回收过程的异同说明

    CMS垃圾回收器主要基于并发-清理算法,目的是减少停顿时间,通过四个主要阶段进行垃圾回收:初始标记、并发标记、重新标记和并发清理,G1垃圾回收器采用标记-整理算法,是JDK9后的默认垃圾收集器,设计为全功能全代收集器
    2024-09-09
  • Java中的日期时间处理及格式化处理

    Java中的日期时间处理及格式化处理

    这篇文章主要介绍了Java中的日期时间处理及格式化处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论