serialVersionUID的作用与生成详解(2种方式)

serialVersionUID的作用与生成详解(2种方式)-mikechen

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(版本标识),如下图所示:

serialVersionUID的作用与生成详解(2种方式)-mikechen

选中类名,按Alt+Enter后,就可以自动生成serialVersionUID版本标识号。

 

serialVersionUID总结

serialVersionUID主要用于在序列化和反序列化过程中进行核验的,是 Java 为每个序列化类产生的版本标识,可用来保证在反序列时,发送方发送的和接受方接收的是可兼容的对象。

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

如果你的类实现的Serializable接口,建议一定要加上serialVersionUID这个字段显示声明版本号。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法