JAVA serialVersionUID的作用
来源:互联网 发布:一套办公软件多少钱 编辑:程序博客网 时间:2024/05/17 19:20
作用
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常[InvalidCastException]
在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
当序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。
两种显示的生成方法
1. 默认的1L
2.64位的哈希字段
根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
隐式的生成方式
当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class(它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个serialVersionUID作序列化版本比较用
这种情况下,如果class文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释,等等),就算再编译多次,serialVersionUID也不会变化的.
使用JDK工具生成
在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID 的值,对于Test.class,执行命令:
serialver Test 这时JVM(java虚拟机)会生成一个哈希字段。
对序列化,反序列化的影响
1.假设Person类序列化之后,从A端传输到B端,然后在B端进行反序列化。在序列化Person和反序列化Person的时候,A端和B端都需要存在一个相同的类。如果两处的serialVersionUID不一致,运行时会抛出InvalidClassException异常
2.序列化端比反序列化端多一个字段,两端的serialVersionID相同,此时序列化和反序列化都是正常的,都是反序列化的结果会丢失多的那个字段属性
3.反序列化端比序列化端多一个字段,两端的serialVersionID相同,此时序列化和反序列化都是正常的,但是反序列化端多出来的属性会赋默认值
例子:
定义一个需要序列化传输的Person类
package com.hqq.day23.serilizable;import java.io.Serializable;/** * Person * Created by heqianqian on 2017/8/9. */public class Person implements Serializable { private static final long serialVersionUID = 12345L; public int id; public String name; //public int age; //private String hobby; public Person(int id, String name) { this.id = id; this.name = name; } public String toString() { return "Person: " + id + " " + name; }}
序列化端
package com.hqq.day23.serilizable;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;/** * SerializableTest * 序列化测试 * 1.如果序列化和反序列化两端的serialVersionUID不同会如何? * 操作:先运行SerializableTest 之后修改Person的serialVersionUID再运行DeSerializableTest * 结果:InvalidClassException: local class incompatible: stream classdesc serialVersionUID = 1234567890, local class serialVersionUID = 12345 * 2.假设两处serialVersionUID一致,如果序列化端增加一个字段,然后序列化,而反序列化端不变,然后反序列化,会是什么情况呢? * 操作:在Person类中添加age[int]属性,执行SerializableTest.之后删除该属性,执行DeserializableTest。 * 结果:序列化和反序列化正常 但是丢失age属性 * 3.假设两处serialVersionUID一致,如果反序列化端加一个字段,序列化端不变,会是什么情况呢? * 结果:增加的字段值为空 * Created by heqianqian on 2017/8/9. */public class SerializableTest { public static void main(String[] args) throws IOException { Person person = new Person(1234, "wang"); //添加一个字段 //person.age = 22; System.out.println("Person Serial" + person); FileOutputStream fos = new FileOutputStream("Person.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(person); oos.flush(); oos.close(); }}
反序列化端
package com.hqq.day23.serilizable;import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;/** * DeserializableTest * 反序列化测试 * Created by heqianqian on 2017/8/9. */public class DeserializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { Person person; FileInputStream fis = new FileInputStream("Person.txt"); ObjectInputStream ois = new ObjectInputStream(fis); person = (Person) ois.readObject(); ois.close(); System.out.println("Person Deserial" + person); }}
IDEA中设置自动生成serialVersionUI的方法
File | Settings | Editor | Inspections
- Java: serialVersionUID的作用
- Java: serialVersionUID的作用
- java serialVersionUID 的作用
- java serialVersionUID的作用
- java serialVersionUID的作用
- java serialVersionUID 的作用
- Java serialVersionUID的作用
- JAVA serialVersionUID的作用
- JAVA中serialVersionUID的作用
- Java中serialVersionUID的作用
- JAVA中SERIALVERSIONUID的作用
- Java中SerialVersionUID的作用
- java中serialVersionUID的作用
- Java中serialVersionUID的作用
- Java中SerialVersionUID的作用
- Java中SerialVersionUID的作用
- Java中serialVersionUID的作用
- Java中serialVersionUID的作用
- Android/安卓仿淘宝直播点赞效果/qq空间点赞效果动画
- POJ 1157 LITTLE SHOP OF FLOWERS(动态规划)
- POJ-棋盘问题
- org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returne
- 区间顺序枚举 hdu5696 区间的价值
- JAVA serialVersionUID的作用
- 微信小程序 向左滑动删除功能
- 解决:vpn连接正常连接,本地连接断开问题
- 首期寄语 | 阿里金融云徐敏:聊聊“安全感”
- 56. Merge Intervals
- Hadoop(2)-HDFS
- 我的python3基础笔记之 【生成器 generator】 05
- Spark-Streaming 和Kafka连接的两种方式
- LCA----【模板】最近公共祖先(LCA)