Java 中的 serialVersionUID 是用来干什么的

2024-01-08 15:32

本文主要是介绍Java 中的 serialVersionUID 是用来干什么的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 概述

在很多实现接口 Serializable 的类中,我们都能看到 private static final long serialVersionUID,他有什么用呢?

如下代码,如果在 A 场景中代码如下

public class UserDTO  implements Serializable {private static final long serialVersionUID = 1L;private String username;private String password;... ...
}

如下代码,如果在 B 场景中代码如下

public class UserDTO  implements Serializable {private static final long serialVersionUID = 1L;private String username;private String password;private String nickname... ...
}

B 场景比 A场景多出一个 nickname 字段,这个时候 serialVersionUID 的值是否相同

如果 UseDTO 在不同场景中使用,

1 用途

用来区分不同版本类的版本是否一致

2 生成方式

2.1 默认生成

 private static final long serialVersionUID = 1L;

2.2 根据类名等生成

根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。

 private static final long serialVersionUID = -1060216618475607933L;

2.3 不提供 serialVersionUID

有的时候没有提供任何 serialVersionUID 的定义,Java序列化机制会根据编译的 class (它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个 serialVersionUID 作序列化版本比较用,这种情况下,如果 class 文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释,等等),就算再编译多次,serialVersionUID 也不会变化的.

3 何时使用

例如实体类 UserDTO ,如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,那么我们把 UserDTO 的不同修改版本的 serialVersionUID 定义为一个值,列化实体都可以相互进行串行化和反串行化。

3.1 Eslipse 中如何生成

使用Eclipse/Myeclipse IDE时,会出现左侧的黄色叹号提示,点击这个黄色叹号

3.2 IntelliJ IDEA 中如何生成

IntelliJ IDEA 默认不提供自动生成

  1. 点击 IntelliJ IDEA> Preferences...(window 中菜单名是 Setting
  2. 选择 Plugins
  3. 在搜索框查询 GenerateSerialVersion
  4. 点击搜索结果中的 No Plugins found Search in repositiories
  5. 点击搜索结果中的插件 Install
  6. 在弹出框中搜索查找 Serializable class without serialVersion ....
  7. 级别选择 warning 点击 apply
  8. 重启 IntelliJ IDEA
  9. 右键我们创建的实体对象 选择 generater->serialVersionUID 系统就会自动生成 private static final long serialVersionUID

4 问题

假设 UserDTO 这个实体类在不同地方使用,对他们设置的 serialVersionUID 进行测试

这篇关于Java 中的 serialVersionUID 是用来干什么的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null