private static final long serialVersionUID = 1L的解释;通俗易懂

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了private static final long serialVersionUID = 1L的解释;通俗易懂相关的知识,希望对你有一定的参考价值。

一、什么是Serializable?

这是java的一个接口,这个接口是用来完成序列化和反序列化操作的。

那么问题来了,什么是序列化和反序列化呢?


二、序列化和反序列化

任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。

这样说可能还是不太明白,更简单直接一点。

序列化:把一个对象以一种方式,打包压缩,成为一个字符串,使他适合存放和传输。

反序列化:把它从字符串中解压缩,返回成一个对象。

有了这个知识点之后,我们再来看private static final long serialVersionUID = 1L;


三、private static final long serialVersionUID = 1L;

为什么要定义这个serialVersionUID呢?

首先我们要知道这个东西叫做,流标识符,即类的版本定义,可以显示声明也可以隐式声明。

隐式声明是通过包名,类名等多个因素计算出来的。很复杂。

这个东西简单的说就是一个版本名字。在反序列化的时候回用到。

JVM在反序列化的时候先去对比这个版本名字,如果数据流中的serialVersionUID和类中的serialVersionUID相同,才会进行反序列化,而不同的话就会抛出异常。一般来说,如果你对一个实现了serializable接口的类进行修改之后,需要修改这个版本信息。

如果你显示定义了private static final long serialVersionUID = 1L;那么如果你忘记修改这个信息,而且你对这个类进行修改的话,这个类也能被进行反序列化。而且不会报错,一个简单的概括就是,如果你忘记修改,那么它是会版本向上兼容的。

如果你不写private static final long serialVersionUID = 1L;即隐式声明的话,而且你对这个类进行修改的话,那么版本上面是不兼容的,于是就会出现反序列化报错的情况

以上是关于private static final long serialVersionUID = 1L的解释;通俗易懂的主要内容,如果未能解决你的问题,请参考以下文章

private static final long serialVersionUID = 1L;

JavaBeans 中添加 private static final long serialVersionUID = 1L

private static final long serialVersionUID = 1L的解释;通俗易懂

private static final long serialVersionUID = 1L用来表明类的不同版本间的兼容性

java 怎样动态修改 private static final int 值

static private 与 final 的用法总结