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的大神可以在下面评论。

  • 相关阅读:
    个人网站开发之用户模块
    个人网站开发记录(三)
    第二章 python变量及文件
    第十二章 函数的----
    第十一章 函数的参数
    第十章 函数
    第九章 内存管理
    第八章 文件的处理
    第七章 字符编码
    第六章 数据类型——元组、字典、集合、数据类型的转换
  • 原文地址:https://www.cnblogs.com/linkstar/p/5657588.html
Copyright © 2011-2022 走看看