很多时候一个新手在写代码的时候,往往你的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. 根据NSString字符串长度自动改变UILabel的frame

    相信大家都遇到过这种需求.如果一个不慎,容易做成这个模样: 话不多说,上代码. 1.首先,设置UILabel的相关属性 UILabel *tmpLabel = [[UILabel alloc] ini ...

  2. php 过滤emoji表情

    function yz_expression() { foreach ($_POST as $key => &$value) { $value = preg_replace_callba ...

  3. 远程桌面协议浅析(VNC/SPICE/RDP)

    由于最近项目涉及到虚拟桌面,就花了点时间找了点资料看了一下,目前常用的协议有VNC/SPICE/RDP三种,就在这里做一个简单的介绍. 三种协议的对比 SPICE VNC RDP BIOS屏幕显示 能 ...

  4. adb shell am 的用法

    adb shell am instrument [options] <COMPONENT> 作用:启动对instrument实例的监视. 参数[options]: -e <key&g ...

  5. 曾经的ps的图片

  6. 《初识PE》导出表

    转自:http://www.blogfshare.com/pe-export.html (二).导出表 当PE文件被执行的时候,Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入, ...

  7. 查看端口号他所占用的exe应用程序

  8. Python 模块功能paramiko SSH 远程执行及远程下载

    模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...

  9. Servlet学习三:不允许直接访问jsp处理方式一过滤器

    转自:http://zy19982004.iteye.com/blog/1755189

  10. nginx+php-fpm 的配置下,php的错误日志

    发现php 运行错误时,浏览器的网页上并没有输出php的错误日志.那php的错误日志在哪里呢? 发现在 /var/log/nginx/error.log文件中. 怎么样才能在浏览器的网页中输出php的 ...