Java程序员在编程中经常看到serialVersionUID ,那serialVersionUID 是什么?有什么作用?如何生成?下面详解@mikechen
什么是serialVersionUID?
serialVersionUID 是用于在序列化和反序列化过程中进行核验的一个版本号。
所有可序列化的类,都有一个静态serialVersionUID属性,如果我们没有显示定义serialVersionUID,IDE默认提供一个serialVersionUID。
serialVersionUID的作用?
serialversionuid的作用是验证版本一致性,这里的版本一致性主要指的:序列化与反序列化的判断标准。
所以要了解serialversionuid的作用,你需要了解序列化与反序列化,这里简要说明下:
什么是序列化与反序列化?
序列化是将对象状态转换为可保持或传输的格式的过程,与序列化相对的是反序列化,它将流转换为对象,这两个过程结合起来,可以轻松地存储和传输数据。
什么情况下需要序列化?
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化(保存到指定介质上如磁盘等),以便将来使用时都需要把对象进行序列化。
什么是Serializable接口
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署提供先决条件。
在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
一句话总结:Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。
serialVersionUID如何生成?
了解完serialVersionUID的作用后,我们再来看看serialVersionUID的生成方式。
serialVersionUID主要有两种生成方式:
第一种:默认的1L
比如:
private static final long serialVersionUID = 1L;
一般来说,默认的serialversionuid是“1L”,在没有手动修改的情况下就是这个。
第二种:根据类、接口等来生成
还有一些时候会通过接口名、成员数等属性生成,那就是“serialVersionUID = xxxxL”,比如:
import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = 1234567890L; private int id; private String name; public Person(int id, String name){ this.id = id; this.name = name; } public String toString(){ return "Person: " + id + " " + name; } }
当一个对象实现 Serializable 接口时,IDEA会提示声明一个静态常量 serialVersionUID(版本标识),如下图所示:
选中类名,按Alt+Enter后,就可以自动生成serialVersionUID版本标识号。
serialVersionUID总结
serialVersionUID主要用于在序列化和反序列化过程中进行核验的,是 Java 为每个序列化类产生的版本标识,可用来保证在反序列时,发送方发送的和接受方接收的是可兼容的对象。
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
如果你的类实现的Serializable接口,建议一定要加上serialVersionUID这个字段显示声明版本号。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》