很多时候一个新手在写代码的时候,往往你的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的大神可以在下面评论。

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

  1. private static final long serialVersionUID = 1L;详解

    public class User implements Serializable { /** * serialVersionUID */ private static final long seri ...

  2. private static final long serialVersionUID = 1L;

    作者:郭无心链接:https://www.zhihu.com/question/24852886/answer/117314768来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  3. 【Struts中private static final long serialVersionUID的作用】

     private static final long serialVersionUID = -1672970955045193907L;   SerialVersionUID,后面简称SUID 其实序 ...

  4. private static final long serialVersionUID = 1L这句话到底什么意思?

    变量serialVersionUID称为序列化版本号,这个变量多用于实现了Serializable的类中,试用场景是类的序列化.当我们没有定义这个变量的时候,虚拟机会根据类的属性算出一个独一无二的该变 ...

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

    浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 ...

  6. private static final 修饰符

    java修饰符分类修饰符字段修饰符方法修饰符根据功能同主要分下几种 1.权限访问修饰符 public,protected,default,private,四种级别修饰符都用来修饰类.方法和字段 包外 ...

  7. public,protected,private,static,final的区别(转载)

    1.类 (1)在java中有public.protected.private三种显示的修饰符用于控制可见性,package不是显示的修饰符,它是隐含的,即如果在类.变量等前没加显示的可见性修饰符,那它 ...

  8. 025:为什么需要将Logger对象声明为private static final类型的

    本文阅读时间大约4分钟. 参考答案 就这个问题而言,我总结了三个原因: 设置为private是为了防止其他类使用当前类的日志对象: 设置为static是为了让每个类中的日志对象只生成一份,日志对象是属 ...

  9. private static final Logger logger= LoggerFactory.getLogger(WhMainBusi.class);

    LoggerFactory.getLogger(WhMainBusi.class):指定类初始化日志对象,在日志输出的时候,将会打印日志信息所在的类.如: logger.info("日志信息 ...

随机推荐

  1. B - 瑶瑶带你玩激光坦克

    B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) S ...

  2. angular中重要指令介绍($eval,$parse和$compile)

    在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者 ...

  3. DateUtils时间工具类探究

    首先声明一下,这个DateUtils工具类不是自己写的,而是在commons-lang-2.Xjar包或是commons-lang3-3.X.jar包中,具体在哪个jar包中,看程序具体添加了哪个版本 ...

  4. 8. Python自定义模块humansize

    我们在提取一个文件元信息的时候,经常会使用到获取元信息的size, 但是默认提取出来的是字节为单位计算的大小,我们需要转换成MB或者GB 或者TB的大小. 因此就需要使用到humansize这个模块, ...

  5. Chapter 1 First Sight——37

    "Never mind, then," he said hastily in a voice like velvet. 别介意,他用天鹅绒般的声音急切的说道 "I can ...

  6. C++之文件输入输出

    在这里遇见不少的问题,其中的路径问题就是在windows中,\\转义字符才能准确的表示路径 #include <iostream> #include <fstream> #in ...

  7. 网络请求 get post

    1.新建一个网络请求工具类,负责整个项目中所有的Http网络请求 提示:同步请求会卡住线程,发送网络请求应该使用异步请求(这意味着类方法不能有返回值) 2.工具类的实现 YYHttpTool.h文件 ...

  8. EF6 第一次,或者相隔一段时间变慢咋办? 我们来优化下

    第一.问题原因分析 EF方面的原因: 1.Code First第一次启动会对比程序中的Model与数据库表(database initializer ),生成Model与数据库的映射视图 2.随着EF ...

  9. Ansible7:Playbook常用模块【转】

    playbook的模块与在ansible命令行下使用的模块有一些不同.这主要是因为在playbook中会使用到一些facts变量和一些通过setup模块从远程主机上获取到的变量.有些模块没法在命令行下 ...

  10. linux下mysql root密码忘记修改方法

    一.MySQL密码的恢复方法之一 如果忘记了MySQL的root密码,可以用以下方法重新设置:1.切换到root下su root 2. KILL掉系统里的MySQL进程: killall -TERM ...