Java中serialVersionUID的作用

我们有时需要将一个对象序列化,保存在本地,或者发送到网络,然后再反序列还原该对象。通常这种对象的类需要实现Serializable接口,在实现该接口时,一般需要提供一个静态变量,像这样子:

public class Throwable implements java.io.Serializable {
    private static final long serialVersionUID = -3042686055658047285L;

如果你定义的类实现了Serializable接口,但是没有提供一个serialVersionUID,像Eclipse这种IDE一般会提醒你要添加该静态变量,并且能帮助你自动生成。那么这个serialVersionUID的作用是啥呢?

当我们将一个对象序列化保存到本地,然后把类的某个成员变量修改了,或者添加了,你再反序列化该对象,能成功反序列化吗?如果没有serialVersionUID,则自然是会报错的,但是,如果有该serialVersionUID变量,当你修改了某个成员变量的名字,或者添加了某个成员变量,或者添加修改了方法,都可以成功反序列化,此处注意一点,被修改了名字的变量名,其实就是相当于一个新变量名。总的来说,serialVersionUID的作用是为了保证对象序列化和反序列化时,类的版本的兼容,

下面给出一个例子,大家可以根据这个例子进行测试学习。

public class SerializableDemo extends Object implements Serializable {

	private static final long serialVersionUID = -3496979029493924435L;

	public byte b = 112;

	// int c = 32;

	public byte getB() {
		return b;
	}

	public void setB(byte b) {
		this.b = b;
	}

	public void saveObject() {
		try {
			FileOutputStream fos = new FileOutputStream(new File(
					"E:\\demo2.txt"));
			ObjectOutputStream os = new ObjectOutputStream(fos);
			SerializableDemo s = new SerializableDemo();

			os.writeObject(s);
			os.flush();
			os.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void readObject() {
		try {

			FileInputStream fis = new FileInputStream(new File("E:\\demo2.txt"));
			ObjectInputStream ois = new ObjectInputStream(fis);

			SerializableDemo s2 = (SerializableDemo) ois.readObject();
			System.out.println(s2.getB());

			ois.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SerializableDemo ser = new SerializableDemo();
		// ser.saveObject();
		ser.readObject();
	}
}
时间: 2024-08-27 12:38:18

Java中serialVersionUID的作用的相关文章

Java中serialVersionUID的解释

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

java中super的作用

super()的作用 super可以用来访问超类的构造方法和被子类所隐藏的方法,如果子类中有方法与超类中的方法名称和参数相同,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父类中所隐藏的语法格式如下: super(参数列表)或super.方法名(参数列表) 下面通过代码展示一下super的用法: package cn.demo; public class Demo1 { public static void main(String[] args) { SubClass_A

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

Java中hashCode的作用

转  http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅读 评论(17) 收藏 举报  分类: JAVA实用笔记(142)  版权声明:本文为博主原创文章,未经博主允许不得转载. 以下是关于HashCode的官方文档定义: [plain] view plain copy hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,j

java.io.Serializable中serialVersionUID的作用

把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中

java中标签的作用

在java中,标签起作用 的唯一的地方刚好是在迭代语句之前. "刚好之前"的意思表明,在标签和迭代之间置入任何语句都不好. 而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关,这是由于break和continue关键词通常只能中断当前循环,但是若随同标签一起使用,他们就会中断循环,直到标签所在的地方 label1: outer-iteraction{ inner-itercation{ break;//1 continue;//2 continue label1

java中return的作用

return的常用作用有以下两种一种是返回参数所用的关键字,假如一个有返回值的方法执行完了之后需要返回一个参数,示例:public string functionTest(){ String a = "abc"; return a;}那么这个方法被调用之后就会返回一个值为abc的字符串,string result = functionTest(); 第二种用法是,代码执行到此处终止.比如当代码执行到某个地方会出现几种结果,然后其中一种结果就不能执行后续代码,这时候在那里加上一个retu

Java中接口的作用

接口的作用 1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. 2.简单.规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白). 当设计大的应用框架时,难免会出现代码耦合,而我们要做的就是让耦合出现在接口上,这样有利用框

java中构造方法及其作用

构造方法作用就是对类进行初始化. 如果你没有定议任何构造方法的形式,程式会为你取一个不带任何参数的构造函数,那么你产生类的对像时只能用不带参数的方法,如:class a {}//没有任何构造函数. 构造方法就是与类同名的那个方法,它的作用是可以用来初始化,例子如下 class Person //人类{ public Person(String n,int a) //构造方法 {  name = n; age = a; }  private string name;  private int ag