在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息。
serialVersionUID 来解决这些问题,新增的serialVersionUID必须定义成下面这种形式:static final
long serialVersionUID=-2805284943658356093L;。其中数字后面加上的L表示这是一个long值。
通过这种方式 来解决不同的版本之间的串行话问题。
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会
自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也
可以把它关掉的,设置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>
Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。
如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入
serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别
Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。
序列化运行时使用一个称为 serialVersionUID
的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该
对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致
InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态
(static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认
serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明
serialVersionUID 值,原因计算默认的 serialVersionUID
对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的
InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java
编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修改器显示声明
serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID
字段作为继承成员没有用处。 serialVersionUID
在Eclipse里可以自动生成,可是在其他大部分IDE工具里面都不能自动生成。但是这个long型值取多少,心里没底,与其写还不如不写。
分享到:
相关推荐
在本篇文章中,我们将详细地解释 serialVersionUID 的概念和用途。 首先,让我们来看看 serialVersionUID 的定义:serialVersionUID 是一个静态常量,它的类型是 long 型。它的主要作用是为了保持版本的兼容性,即...
serialVersionUID 作用全面解析 serialVersionUID 是 Java 序列化机制中一个非常重要的概念,它是 Java 序列化机制的核心组件。 serialVersionUID 是一个长整型常量,用于标识类的版本号。在 Java 序列化机制中,...
IntelliJ IDEA 自动生成 serialVersionUID 在 Java 序列化机制中,...IntelliJ IDEA 自动生成 serialVersionUID 是一个非常有用的功能,它可以帮助开发者更方便地实现序列化和反序列化,提高开发效率和质量。
Java类中serialVersionUID的作用及其使用 Java类中serialVersionUID是一种特殊的静态变量,用于标识类的序列化版本。它是Java语言中实现Serializable接口的类必须定义的变量,用于在反序列化时验证类的版本一致性。...
序列化版本号serialVersionUID的作用_动力节点Java学院整理.
这就是`serialVersionUID`的作用。 `serialVersionUID`是一个长期不变的标识,用于识别特定类的序列化版本。当Java在反序列化时检测到目标类的`serialVersionUID`与原始序列化数据中的`serialVersionUID`不匹配时,...
综上所述,`serialVersionUID` 在 Java 的序列化机制中扮演着关键角色,它不仅能够确保序列化数据的一致性和完整性,还能够在类结构发生变化时帮助开发者有效管理版本兼容性问题。理解并正确使用 `serialVersionUID`...
三期第一张IO笔记 6
"IDEA如何自动生成serialVersionUID" IDEA中自动生成serialVersionUID是Java开发中的一项重要功能,因为serialVersionUID是一个非常重要的字段,用于验证类的版本一致性。在本文中,我们将详细介绍如何使用IDEA自动...
`serialVersionUID`的主要作用是确保在类版本升级后,序列化的兼容性得以维持。 序列化接口`Serializable`的实现类需要一个`serialVersionUID`字段,它是一个长期不变的标识符,用于识别特定版本的类。当一个类被...
Java 序列化和 serialVersionUID 的使用方法实例 Java 序列化是指将 Java 对象转换为二进制流的过程,以便在网络中传输或持久化到数据库或文件系统中。序列化的作用是将 Java 对象的状态保存起来,以便下次使用时...
`serialVersionUID`在Java序列化过程中起着关键作用。 首先,让我们来理解什么是IO流。IO流是Java中处理数据输入和输出的一种机制。Java提供了一整套类库来支持不同类型的流,包括字符流和字节流,它们分别处理文本...
《GenerateSerialVersionUID:Java序列化ID自动生成工具详解》 在Java编程中,序列化是一个重要的概念,它允许对象...理解`serialVersionUID`的作用,并熟练运用相关工具,对于提升Java项目质量和维护性具有重要意义。
实现`Serializable`接口,配合使用特殊序列化方法,以及妥善管理`serialVersionUID`,可以有效地控制和优化对象的序列化过程。这对于数据持久化、网络通信以及分布式系统中的对象交换都有着至关重要的作用。
在Java编程中,序列化和反序列化是常见的数据转换操作,用于将对象的状态...通过这种方式,可以有效地解决在反序列化过程中因`serialVersionUID`不一致导致的问题,同时减少潜在的副作用,提升程序的稳定性和安全性。
使用 @SuppressWarnings("serial") 注解可以抑制该警告信息,但是我们仍然推荐提供 serialVersionUID 字段,以确保类的序列化和反序列化操作的正确性。 二、@SuppressWarnings("xxxxx")是什么意思? @...
系统会根据类的修饰符、实现的接口、定义的方法以及属性等信息计算出 serialVersionUID,因而导致本地的实体类和服务器上的实体类的 serialVersionUID 不一致。 解决方案 解决反序列化失败的解决方案是给相关实体...
在给定的链接"Java序列化机制(2)- serialVersionUID 实验"中,博主通过一个实验详细解释了`serialVersionUID`的作用和重要性。实验可能包括以下步骤: 1. 创建一个实现`Serializable`接口的简单类,并运行序列化...