为什么要有SerialVersionUID?

为什么要有SerialVersionUID?应该说为什么要手动声明一个ServialVersionUID。因为只要你做了序列化了,JAVA就会自动给你加上一个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都可以。

为什么要有SerialVersionUID?

时间: 2024-08-09 19:52:28

为什么要有SerialVersionUID?的相关文章

Java序列化中的SerialVersionUid

版权声明:本文为博主fbysss原创文章,转载请注明出处 作者:fbysssmsn:jameslast[email protected]  blog:blog.csdn.NET/fbysss声明:本文由fbysss原创,转载请注明出处关键字:SerialVersionUid 序列化 一.前言 SerialVersionUid,简言之,其目的是序列化对象版本控制,有关各版本反序列化时是否兼容.如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassExceptio

IDEA 自动生成serialVersionUID

场景:刚转到用IDEA,因为需要生成serialVersionUID,并没有自动生成. 转自:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,

Idea_Intellij Idea 12 生成serialVersionUID的方法

默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需要做以下设置: 1.setting->Inspections->Serialization issues,将serialzable class without "serialVersionUID"打上勾: 2.将光标放到类名上,按atl+enter键,就会提示生成serialV

serialVersionUID的作用

serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException. serialVersionUID有两种显示的生成方式:        一是默认的1

serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID

说到serialVersionUID,首先要讲讲序列化. 序列化: 序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库.文件系统中,反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象. 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再恢复为Java

Intellij Idea 15 生成serialVersionUID的方法

默认情况下Intellij IDEA是关闭了继承了Serializable接口的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需要做以下设置: 1.setting->Inspections->Serialization issues,将serialzable class without "serialVersionUID"打上勾: 2.将光标放到类名上,按atl+enter键,就会提示生成serialVersion

Java中serialVersionUID的解释

Java中serialVersionUID的解释 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:        private static final   long     serialVersionU

serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Serializable其实是一个空接口 package java.io; public interface Serializable { } Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化. 什么情况下需要序列化 a)当你想把的内存中的对象写入到硬

71. Java中序列化的serialVersionUID作用

Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法:为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常. Eclipse中The

Java中的SerialVersionUID

序列化及SergalVersionUID困扰着许多Java开发人员.我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serializable接口的类中没有定义SerialVersionUID的话会怎样?抛开它的复杂性以及不太常用不说,一个原因就是Eclipse在缺少了SerialVersionUID之后的给出的警告提示:"The Serializable class Customer does not declare a static final SerialVersi