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();
	}
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。