zoukankan      html  css  js  c++  java
  • 困扰你的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的大神可以在下面评论。

  • 相关阅读:
    JS学习之构造函数、原型、原型链
    JS学习之面向对象(面向对象的创建方法,new运算符的工作原理)
    JS学习之事件流
    JS学习之生命周期与垃圾回收机制
    关于在XP操作系统和IIS5.1环境下的MVC环境搭建之IIS错误
    VS2010、.net 4.0下MVC3开发中Code First开发模式的数据迁移小结
    关于MVC3框架下的Jquery异步请求函数的学习心得之一——$.post()
    关于ASP调用存储过程的经典资料转载
    关于windows环境下的IIS 500内部服务器错误的一种解决办法
    接VS2010+Net+MVC3+EF4.1环境下的Code First一文的补充说明
  • 原文地址:https://www.cnblogs.com/linkstar/p/5657588.html
Copyright © 2011-2022 走看看