package tigers;
import java.io.*;
public class Tiger5 {
static class Inner implements Serializable {
private String name;
public Inner(String name) {
this.name = name;
}
public String toString() {
return "Tiger5$Inner:(" + name + ")";
}
// public void todo() {}
}
private static void writeObject(Inner in) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Tiger5$Inner.tmp"));
oos.writeObject(in);
}
private static Inner readObject() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Tiger5$Inner.tmp"));
return (Inner) ois.readObject();
}
public static void main(String[] args) {
Inner in = new Inner("inner");
try {
writeObject(in);
// in = readObject();
System.out.println(in);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
老版本的Inner对象被序列化到Tiger5$Inner.tmp文件中。
现在,在Inner中增加一个简单的非私有的todo()方法:
public void todo(){}
并修改main()方法如下,以便用新版本Inner类进行反序列化:
try {
// writeObject(in);
in = readObject();
System.out.println(in);
} catch (Exception e) {
e.printStackTrace();
}
结果:
java.io.InvalidClassException: tigers.Tiger5$Inner; local class incompatible: stream classdesc serialVersionUID = 925364839964073665, local class serialVersionUID = 2692111289122516972
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:519)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1546)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at tigers.Tiger5.readObject(Tiger5.java:34)
at tigers.Tiger5.main(Tiger5.java:40)
现在在Inner中加入版本控制字段:
private static final long serialVersionUID = 0;
然后按上面的步骤将老版本Inner对象序列化,并用新版本Inner对象读取,发现可以成功读取。