困扰你的private static final long serialVersionUID

很多时候一个新手在写代码的时候,往往你的IDE就会告诉你一个警告

然后你点击处理这个警告之后,它就会默认给你的类生成一个

private static final long serialVersionUID = 1L;

然后强迫症的孩子就一直不明白为什么会需要这个东西,这个东西到底是干嘛用得呢?

然后渐渐的你会发现,这个东西和你写的代码毫无关系,没什么卵用,于是渐渐的你就把他扔在一边了。

这次我就需要来解决这个问题,困扰你的private static final long serialVersionUID

首先我们需要知道一个知识点:什么是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 final long serialVersionUID = 1L;然后每次修改类的属性,修改一下这个值就行了。

然后顺便提一句:springMVC中的controller不需要声明的,而struts2中的action是需要的,seevlet也是需要声明的。至于为什么,需要看框架源码你才能明白为什么会是这样的。这里就不多说了,其实我也不会。如果有NB的大神可以在下面评论。

时间: 2024-09-27 17:25:50

困扰你的private static final long serialVersionUID的相关文章

private static final long serialVersionUID = 1L;

作者:郭无心链接:https://www.zhihu.com/question/24852886/answer/117314768来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 其实答主想问的是serialVersionUID的作用. 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的. 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionU

private static final long serialVersionUID = 1L;详解

public class User implements Serializable { /** * serialVersionUID */ private static final long serialVersionUID = 1L; /** * 主键ID */ private Integer userId; /** * 用户名 */ private String userName; /** * 密码 */ private String passWord; /** * 姓名 */ privat

创建servlet类时出现的“private static final long serialVersionUID = 1L;”语句是什么意思啊?

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性.如果你修改了此类, 要修改此值. 否则以前用老版本的类序列化的类恢复时会出错. 实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static final long serialVersionUID = 1L; 为了在反序列化时, 确保类版本的兼容性,最好在每个要序列化的类中加入private static final long

private static final long serialVersionUID的作用

今天在看项目源码的时候发现struts的action里面有 private static final long serialVersionUID = -1672970955045193907L; 这样的一条语句. 中文搜索之后,全部都是 如果你修改了此类, 要修改此值.否则以前用老版本的类序列化的类恢复时会出错.为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义. 中文的

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

Java中serialVersionUID的解释 serialVersionUID作用: 相当于java类的身份证.主要用于版本控制.serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名.接口名.成员方法及属性等来生成

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

这个东西是用来serialization 的key,A和B相互之间传输信息,用seralize,但是相互之间把解包之后的文件进行了更改,如果你程序中不加这个,相互之间再传输,会因为这个key不一样,而失败.所以,在程序中定义,会使软件版本兼容,无论怎么改,都可以相互序列化和反序列化. Java中,如果class实现了序列化接口,你没有加这一行,eclipse会自动给warning,建议加上,否则,JVM会自动编译生成一个序列号,这样传输会造成反序列化失败.因为不同的JVM之间的序列化算法是不一样

浅析java修饰符之public default protected private static final abstract

浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 二   分类(大致分两类) 1.访问修饰符,包括:public default protected private 2.非访问修饰符,包括:static final abstract 三 访问修饰符--Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权

PowerMockito模拟private static final类变量

mock模拟private static final now=system.currentmills; 首先在测试类开头加上: @prepareForTest({System.class}) Class A{ } 然后,在方法上添加:powermockito.mockstatic(system.class);powermockito.when(system.currentmills).thenreturn(now);system.currentmills; 如果要mock模拟类的变量Class

Eclipse警告:The serializable class XXX does not declare a static final serialVersionUID field of type long

serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 在Eclipse中可以自动生成,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L. 当你