private static final long serialVersionUID = 1L;
作者:互联网
什么是Serializable?
这是java的一个接口,这个接口是用来完成序列化和反序列化操作的。
那么问题来了,什么是序列化和反序列化呢?
任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。
这样说可能还是不太明白,更简单直接一点。
把一个对象以一种方式,打包压缩,成为一个字符串,使他适合存放和传输,这就是序列化。
反序列化,就是把它从字符串中解压缩,返回成一个对象。
有了这个知识点之后,我们再来看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,long,序列化,1L,serialVersionUID 来源: https://www.cnblogs.com/2021dayang/p/16530940.html