- 浏览: 16600 次
最新评论
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
关于其定义,可参考JDK文档:
http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html
在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。
add default serial version ID:
Adds a default serial version ID to the selected type
Use this option to add a user-defined ID in combination with custom serialization code if the type did undergo structural change since its first release.
add generated serial version ID:
Adds a generated serial version ID to the selected type
Use this option to add a compiler-generated ID if the type didnot undergo structural change since its first release.
一种就是1L,一种是生成一个很大的数,这两种有什么区别呢?
看上去,好像每个类的这个类不同,似乎这个SerialVersionUid在类之间有某种关联。其实不然,两种都可以,从JDK文档也看不出这一点。我们只要保证在同一个类中,不同版本根据兼容需要,是否更改SerialVersionUid即可。
对于第一种,需要了解哪些情况是可兼容的,哪些根本就不兼容。 参考文档:http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
在可兼容的前提下,可以保留旧版本号,如果不兼容,或者想让它不兼容,就手工递增版本号。
1->2->3.....
第二种方式,是根据类的结构产生的hash值。增减一个属性、方法等,都可能导致这个值产生变化。我想这种方式适用于这样的场景:
开发者认为每次修改类后就需要生成新的版本号,不想向下兼容,操作就是删除原有serialVesionUid声明语句,再自动生成一下。
个人认为,一般采用第一种就行了,简单。第二种能够保证每次更改类结构后改变版本号,但还是要手工去生成,并不是修改了类,会提示你要去更新这个SerialVersionUid,所以虽然看上去很cool,实际上让人很迷惑。
参考:
1.一篇较好的关于serialVesionUid的说明:
http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
关于其定义,可参考JDK文档:
http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html
在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。
add default serial version ID:
Adds a default serial version ID to the selected type
Use this option to add a user-defined ID in combination with custom serialization code if the type did undergo structural change since its first release.
add generated serial version ID:
Adds a generated serial version ID to the selected type
Use this option to add a compiler-generated ID if the type didnot undergo structural change since its first release.
一种就是1L,一种是生成一个很大的数,这两种有什么区别呢?
看上去,好像每个类的这个类不同,似乎这个SerialVersionUid在类之间有某种关联。其实不然,两种都可以,从JDK文档也看不出这一点。我们只要保证在同一个类中,不同版本根据兼容需要,是否更改SerialVersionUid即可。
对于第一种,需要了解哪些情况是可兼容的,哪些根本就不兼容。 参考文档:http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf
在可兼容的前提下,可以保留旧版本号,如果不兼容,或者想让它不兼容,就手工递增版本号。
1->2->3.....
第二种方式,是根据类的结构产生的hash值。增减一个属性、方法等,都可能导致这个值产生变化。我想这种方式适用于这样的场景:
开发者认为每次修改类后就需要生成新的版本号,不想向下兼容,操作就是删除原有serialVesionUid声明语句,再自动生成一下。
个人认为,一般采用第一种就行了,简单。第二种能够保证每次更改类结构后改变版本号,但还是要手工去生成,并不是修改了类,会提示你要去更新这个SerialVersionUid,所以虽然看上去很cool,实际上让人很迷惑。
参考:
1.一篇较好的关于serialVesionUid的说明:
http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/
发表评论
-
JavaWeb 之 session
2017-10-12 15:06 0一、Session ... -
git clone命令
2017-10-10 15:30 1093git clone 命令参数: usage: gi ... -
Mac下idea快捷键
2017-10-09 17:21 392IntelliJ IDEA For Mac 快捷 ... -
浅谈java中的堆栈(二)
2016-12-16 17:50 0Java 中的堆和栈 Java把内存划分成两种:一种是 ... -
浅谈java中的堆栈(一)
2016-12-16 17:28 304Java把内存分成两种,一种叫做堆内存,一种叫做栈内存:在 ... -
导出excel的两种方式(二)
2015-12-17 15:26 7801.调用类如下: @RequestMapping(&quo ... -
导出excel的两种方式(一)
2015-12-17 15:10 6711.导出excel方法调用: import org.apa ... -
正确选择使用字符串或者数字
2015-12-08 10:53 433在我多年的开发经验中,经常发现的一个情况就是,很多项目的对象 ... -
mybatis在xml文件中处理大于号小于号的方法
2015-06-11 17:30 392第一种方法: 用了转义字符把>和<替换掉,然 ... -
为什么使用redis
2015-06-11 17:41 469先解释一下软件编程中常见的一些概念: 抽象先于具象。这个抽象 ... -
mybatis入门三之使用MyBatis Generator生成DAO
2015-06-10 18:06 866虽然MyBatis很方便,但是想要手写全部的mapper还是很 ... -
mybatis入门二之添加ehcache缓存支持
2015-06-10 17:57 510为了提高MyBatis的性能, ... -
mybatis入门一
2015-06-10 17:53 324ibatis的3.X版本改名了,叫做MyBatis,暂且不讨论 ... -
spring+mybatis优缺点
2015-06-10 16:43 1610一、mybatis的优缺点: ... -
struts1与struts2
2015-06-10 15:39 3641.struts2不是struts1的升级,而是继承的webw ... -
Java语言滴transient
2015-03-26 21:48 483transient说明一个属性是临时的,不会被序列化。详看事例 ... -
Java语言滴Interface(二)
2015-03-26 21:03 4841.看代码: public interface Anima ... -
Java语言滴Interface
2015-03-26 18:32 4211.相对abstract class(抽象类)来讲,inter ...
相关推荐
Java 中 serialVersionUID 的解释 Java 中的 serialVersionUID 是一个非常重要的概念,在实现 Serializable 接口的类中,它扮演着至关重要的角色。那么,serialVersionUID到底是什么?它又是如何生成的?在本篇文章...
在Java编程中,`serialVersionUID` 是一个非常重要的概念,特别是在序列化和反序列化过程中。这个特殊标识符主要用于版本控制,确保不同版本的类在序列化和反序列化时能够正确匹配。当我们讨论`serialVersionUID`时...
### Java 类中 `serialVersionUID` 详解 #### 一、`serialVersionUID` 概述 在 Java 中,`serialVersionUID` 是一个与类关联的长整型常量,用于支持序列化机制。当一个对象被序列化时,该对象所属类的 `...
Java类中serialVersionUID的作用及其使用 Java类中serialVersionUID是一种特殊的静态变量,用于标识类的序列化版本。它是Java语言中实现Serializable接口的类必须定义的变量,用于在反序列化时验证类的版本一致性。...
在 Java 序列化机制中,serialVersionUID 是一个不可或缺的角色,它可以通过在运行时判断类的 serialVersionUID 来验证版本一致性。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID 与本地相应实体...
Java中的`serialVersionUID`是一个非常重要的概念,尤其是在处理序列化和反序列化操作时。序列化是将对象的状态转换为字节流的过程,而反序列化则是将字节流恢复为对象状态。`serialVersionUID`的主要作用是确保在类...
`serialVersionUID`在Java序列化过程中起着关键作用。 首先,让我们来理解什么是IO流。IO流是Java中处理数据输入和输出的一种机制。Java提供了一整套类库来支持不同类型的流,包括字符流和字节流,它们分别处理文本...
Java 序列化和 serialVersionUID 的使用...Java 序列化和 serialVersionUID 是 Java 中非常重要的概念,它们用于实现对象的持久化和网络传输。正确使用 serialVersionUID 可以确保版本的兼容性,避免反序列化时的异常。
如果两个不同版本的类具有相同的`serialVersionUID`,那么在反序列化过程中可能会出现`InvalidClassException`异常,这是因为Java序列化机制认为这两个版本是不兼容的。 #### 五、`serialVersionUID`的定义 `...
在 Java 中,当一个类实现了java.io.Serializable接口时,编译器会提示一个黄色的警告,因为该类没有提供 serialVersionUID 字段。serialVersionUID 是一个私有静态常量,用于标识类的版本号。在序列化和反序列化...
序列化版本号serialVersionUID的作用_动力节点Java学院整理.
三期第一张IO笔记 6
关键代码位于`java.io.ObjectStreamClass#initNonProxy`方法中,该方法会比较类的serialVersionUID以判断是否匹配。 为了绕过这个检查,我们可以尝试破坏以下三个条件之一: 1. 本地和远程类是否都实现了...
serialVersionUID 是 Java 序列化机制中一个非常重要的概念,它是 Java 序列化机制的核心组件。 serialVersionUID 是一个长整型常量,用于标识类的版本号。在 Java 序列化机制中,serialVersionUID.play 一个非常...
为了避免序列化过程中出现`java.io.InvalidClassException`异常,特别是处理序列化对象版本兼容性问题时,强烈推荐在所有可序列化的类中显式声明`serialVersionUID`。这不仅可以提高程序的稳定性和健壮性,还能简化...
在Java编程中,自定义事件是扩展应用程序功能和实现组件间通信的重要手段。当你需要在类之间传递特定信息或触发特定行为时,自定义事件能提供极大的灵活性。本教程将深入探讨如何在Java中创建并使用自定义事件,以...
本文详细介绍了Spark中的五个经典转换算子的Java实现,包括Map、FlatMap、Filter、MapPartitions和Distinct。这些算子在实际项目中被广泛使用,可以帮助开发者高效地处理大规模数据。此外,文章还提供了每个算子的...
本章节主要讲解Java的序列化机制,包括Serializable接口、Externalizable接口、transient关键字、serialVersionUID变量等。 Java学习系列(十三):Java面向对象之界面编程 本章节主要讲解Java的界面编程,包括AWT...
在给定的链接"Java序列化机制(2)- serialVersionUID 实验"中,博主通过一个实验详细解释了`serialVersionUID`的作用和重要性。实验可能包括以下步骤: 1. 创建一个实现`Serializable`接口的简单类,并运行序列化...
Java 中使用 List 遇到黄色警告图标如何去除 Java 中使用 List 时出现黄色警告图标的原因是由于没有使用泛型,导致编译器无法确定 List 中保存的对象类型。解决方法是使用泛型,例如 `List<String> list = new ...