public class User implements Serializable {/*** serialVersionUID*/private static final long serialVersionUID = 1L;/*** 主键ID*/private Integer userId;/*** 用户名*/private String userName;/*** 密码*/private String passWord;/*** 姓名*/private String name;/*** 邮箱*/private String email;/*** 是否可用,0表示正常,1表示冻结*/private Integer state;/*** get、set方法** @return*/public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getState() {return state;}public void setState(Integer state) {this.state = state;}}

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static final long serialVersionUID = 1L;
为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.  
在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。

这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。
当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。

关于serialVersionUID的解释

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。
Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long
那是Eclipse提供这个提示功能给你吧.
你点它warning的icon两下Eclipse就会自动给定.
如果你不喜欢,可以把它关掉,
windows -> preferences -> compiler -> Error/Warnings
-> Potential Programming problems
将Serializable class without serialVersionUID的warning改成ignore.

其实如果你没有考虑到兼容性问题时,那就把它关掉吧.
其实有这个功能是好的.
只要任何类别实作了Serializable这个介面,
如果没有加入serialVersionUID,Eclipse都会给你warning提示,
这个serialVersionUID为了让该类别Serializable後兼容.

考虑一下,如果今天你的类Serialized存到硬碟里,
可是後来你却更改了类别的field(增加或减少或改名).
当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.

但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize.
这个可以避开不兼容性的问题.

异常状态:
The serializable class XXX does not declare a static final serialVersionUID field of type long

private static final long serialVersionUID = 1L详解相关推荐

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

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

  2. private static final long serialVersionUID = 1L 干什么的?

    private static final long serialVersionUID = 1L:是定义以一个序列号.java源码里有大量的类都有这么一个序列号.目的就是把java对象序列化而后进行保存 ...

  3. private static final long serialVersionUID=1L 是什么意思

    private static final long serialVersionUID=1L意思是定义程序序列化ID. 序列化ID等同于身份验证,主要用于程序的版本控制,维护不同版本的兼容性以及避免在程 ...

  4. private static final long serialVersionUID = 1L 的作用

    1.这句话的意思是定义程序序列化ID 2.什么是序列化? Serializable,Java的一个接口,用来完成java的序列化和反序列化操作的: 任何类型只要实现了Serializable接口,就可 ...

  5. private static final long serialVersionUID=1L作用

    private static final long serialVersionUID=1L意思是定义程序序列化ID. 序列化ID等同于身份验证,主要用于程序的版本控制,维护不同版本的兼容性以及避免在程 ...

  6. private static final long serialVersionUID = 1L 是什么意思

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

  7. private static final long serialVersionUID是什么意思

    今天在看项目源码的时候发现struts的action里面有 private static final long serialVersionUID = -1672970955045193907L; 这样 ...

  8. java中private string_java 中private static final String string的介绍final的意思

    java 中private static final String string的介绍final的意思: final的意思是这个string类型的东西不能再被改变.也可以说是常量 static说明这个 ...

  9. java中常量final的用法_详解Java中final的用法

    本文主要介绍了Java中final的使用方法,final是java的关键字,本文就详细说明一下它的使用方法,需要的朋友可以参考下 概念 final 具有"不可改变的"的含义,可以修 ...

最新文章

  1. Ruby之Rspec的报错解决
  2. 成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容。 此图形驱动程序无法找到兼吝的图形硬件。
  3. 一阶电路暂态响应的结果分析。_反激式DCDC变换器的分析、计算与仿真精讲
  4. Chrome浏览器查看cookie
  5. Python面向对象之接口类(抽象类)
  6. 7-26 Windows消息队列
  7. 一个简单的C#获取Session、设置Session类文件
  8. 拜托!代码有BUG不一定都是程序员的锅
  9. 帝国CMS7.2 7.5微信登录插件
  10. 【C语言深入】[001] static 关键字:
  11. Java三种类型之间的转换方法:Date、String、Calendar类型之间的转化
  12. Jetpack 介绍
  13. json 微信小程序 筛选_GitHub - zhengyangkang/sl-filter: uni -app 一款使用简单的筛选组件,适配app、微信小程序、H5。...
  14. 原来普洱茶还有预防头痛,减轻体重,缓解压力和失眠的作用,而且是年份久的普洱茶效果好
  15. 这年头能真正掌握Javaassist技术的程序员真不多
  16. 485通信c语言编程linux,Rs485通信单片机C程序
  17. 使用git命令导出项目_git自动生成changelog及项目版本管理
  18. 我所关心的POS打印机技术参数
  19. PCL学习:随机采样一致性算法(RANSAC)
  20. Praat脚本-005 | 标注文件批量增加层级

热门文章

  1. BUHLER MKS1/W 2889999
  2. 为增强供应链安全,美国将设立“国家供应链完整性之月”
  3. 仿QQ弹出窗口 gggggggggggg
  4. 重启电脑打印服务自动停止
  5. 服务器usb电源型号,锂电池、龙威305D电源、故障平板、同轴电缆、惠普服务器电源、4T硬盘、USB显卡、AP等...
  6. k8s之ConfigMap详细理解及使用
  7. 精辟,16张图说透Modbus-RTU协议
  8. Kotlin “谈” “弹” “潭”
  9. 1989旧金山地震:动物预测成功的非经典案例
  10. 怎么通过UI自动化方式获取文章信息?