我们有时需要将一个对象序列化,保存在本地,或者发送到网络,然后再反序列还原该对象。通常这种对象的类需要实现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();
}
}