private static final long serialVersionUID = 1L;详解
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;详解的更多相关文章
- private static final long serialVersionUID = 1L;
作者:郭无心链接:https://www.zhihu.com/question/24852886/answer/117314768来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- private static final long serialVersionUID = 1L这句话到底什么意思?
变量serialVersionUID称为序列化版本号,这个变量多用于实现了Serializable的类中,试用场景是类的序列化.当我们没有定义这个变量的时候,虚拟机会根据类的属性算出一个独一无二的该变 ...
- 困扰你的private static final long serialVersionUID
很多时候一个新手在写代码的时候,往往你的IDE就会告诉你一个警告 然后你点击处理这个警告之后,它就会默认给你的类生成一个 private static final long serialVersion ...
- 【Struts中private static final long serialVersionUID的作用】
private static final long serialVersionUID = -1672970955045193907L; SerialVersionUID,后面简称SUID 其实序 ...
- 浅析java修饰符之public default protected private static final abstract
浅析java修饰符之public default protected private static final abstract 一 修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 ...
- PHP中public,private,protected,abstract等关键字用法详解
PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...
- Java中static变量作用和用法详解
static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...
- static,静态关键字的详解
一,使用static声明属性 class Person{ // 定义Person类 String name ; // 定义name属性,暂时不封装 int age ; // 定义age属性,暂时不封装 ...
- JAVA的对象和封装及static与final的用法(详解)
一:软件出现的目的 1:用计算机的语言描述现实世界 2:用计算机解决现实世界的问题 编程思维: 使用面向对象的思想(描述)面向对象的世界 (符合人类的思维习惯) 二:面向对象设计和开发程序的 ...
随机推荐
- Linux常用操作命令(一)
java程序员要学习一些linux知识 java程序员要学习一些linux知识,下面就是您要学的命令:大型J2EE应用都在建构在linux环境下的.开发环境下我们可以通过samba映射成本地的网络驱动 ...
- 【LeetCode】67. Add Binary
题目: Given two binary strings, return their sum (also a binary string). For example,a = "11" ...
- 6.如何使用jedis的线程池
Basic usage example using Jedis in a multithreaded environment You shouldn't use the same instance f ...
- 学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
一.什么是Github Github是全球最大的社交编程及代码托管网站(https://github.com/). Github可以托管各种git库,并提供一个web界面(用户名.github.io/ ...
- python编程快速上手之第3章实践项目参考答案
1 #!/usr/bin/env python 2 # coding:utf-8 3 # write by mfyang 4 # collatz.py 5 # 从用户读入一个值,并判断这个值是不是一个 ...
- voa 2015 / 4 / 25
When English speakers talk about time and place, there are three little words that often come up: in ...
- PHP实现跨域解决方法
如果要实现跨域通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如 ...
- Udp实现消息的发送和接收、以及图片的上传
//Udp实现消息的发送和接收 import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagram ...
- Go学习笔记(二)十分钟上手
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 变量&常量 变量 变量名由字母.数字.下划线组成,不能以数字开头. ... var ( A int //默 ...
- box-shadow阴影详解
每次使用box-shadow,都要查阅资料才能实现对应的效果,现在总结一下,方便以后查看. 使用语法: element{box-shadow: inset x-offset y-offset blur ...