如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。
而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。而新增的值则会设置成null,删除的值则不会显示。
一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
提示功能告诉你去定义
package com.sxit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Serializable01 extends Object implements Serializable{
private static final long serialVersionUID = -1466479389299512377L;
public byte b = 12;
public byte getB() {
return b;
}
public void setB(byte b) {
this.b = b;
}
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream(new File("E:\\tmp\\demo2.txt"));
ObjectOutputStream os = new ObjectOutputStream(fos);
Serializable01 s = new Serializable01();
os.writeObject(s);
os.flush();
os.close();
FileInputStream fis = new FileInputStream(new File("E:\\tmp\\demo2.txt"));
ObjectInputStream ois = new ObjectInputStream(fis);
Serializable01 s2 = (Serializable01)ois.readObject();
System.out.println(s2.getB());
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}