首页 > 代码库 > 为什么要有SerialVersionUID?
为什么要有SerialVersionUID?
为什么要有SerialVersionUID?应该说为什么要手动声明一个ServialVersionUID。因为只要你做了序列化了,JAVA就会自动给你加上一个SerialVersionUID。
terminal中javac Test.java编译完以后 没有语法错误以后java SerialVersionUIDTest,打印出“Hi,My name is hackingwu‘.
把你之前的对象凡序列出来,他就会报类似以下的错误;
所以你明白SerialVersionUID显式的声明出来把。
Java强烈建议我们显式的声明一个SerialVersionUID,因为SerialVersionUID默认值的计算是根据类的各个方面得来的(属性,方法。。。)。
详情:http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html。
为什么要显式的声明一个SerialVersionUID,因为当你的修改了你的类(属性和方法),那么你当前类的默认SerialVersionUID(local class serialVersionUID)就会改变,和你以前序列化到本地的SerialVersionUID(stream classdesc serialVersionUID )不同,那么你这时候反序列就会出错!抛出异常java.io.InvalidClassException!
下面举例说明:
创建Test.java,敲入一下代码:
import java.io.Serializable; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; class Person implements Serializable{ private static final long serialVersionUID = 2; private String name; private String address; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getAddress(){ return address; } public void setAddress(String address){ this.address =address; } } class SerialVersionUIDTest{ public static void main(String[] args) throws Exception{ Person person = new Person(); person.setName("hackingwu"); ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("test")); oo.writeObject(person); oo.close(); ObjectInputStream oi = new ObjectInputStream(new FileInputStream("test")); Person person_back = (Person)oi.readObject(); System.out.println("HI,My name is "+person_back.getName()); oi.close(); } }
terminal中javac Test.java编译完以后 没有语法错误以后java SerialVersionUIDTest,打印出“Hi,My name is hackingwu‘.
接着你将你的person中添加一个属性”private int age;“
在把SerialVersionUIDTest类把序列化的代码去掉,即
class SerialVersionUIDTest{ public static void main(String[] args) throws Exception{ ObjectInputStream oi = new ObjectInputStream(new FileInputStream("test")); Person person_back = (Person)oi.readObject(); System.out.println("HI,My name is "+person_back.getName()); oi.close(); } }
把你之前的对象凡序列出来,他就会报类似以下的错误;
Exception in thread "main" java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8903762676869424108, local class serialVersionUID = -2818023061976787765
所以你明白SerialVersionUID显式的声明出来把。
试一下显式的声明,这个异常就能消失了,声明成1,2都可以。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。