一是默认的1L,比如:private static final long serialVersionUID = 1L;
二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,一般IDE可以帮助你生成。
如果我序列化成功了一个对象,然后更改它的serialVersionUID,反序列化时会报错,比如上面的例子,serialVersionUID改成7245589157910452599:
java.io.InvalidClassException: io.kzw.advance.csdn_blog.TestSerializable$Coder; local class incompatible: stream classdesc serialVersionUID = -7245589157910452599, local class serialVersionUID = -7245589157910452689
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1630)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at io.kzw.advance.csdn_blog.TestSerializable.main(TestSerializable.java:24)
6. 序列化后能修改类吗?
修改之后需要重新进行序列化,但是其实是可以的,如果你能接收反序列化的对象拿不到修改的属性值。
private static class Coder implements Serializable {
private static final long serialVersionUID = -7245589157910452689L;
String name;
int age;
String lang;
int sex;
}
上面给Coder类新增了一个sex属性,反序列化后拿不到sex的值,因为之前序列化的对象没有这个属性。
7. 序列化前和序列化后的对象的关系
是==还是equal? 是浅复制还是深复制?
答案是深复制,反序列化还原后的对象地址与原来的的地址不同。
8. 静态变量能否序列化?
不能。
private static class Coder implements Serializable {
private static final long serialVersionUID = -7245589157910452689L;
static int years;
String name;
int age;
String lang;
int sex;
}
给上面的Coder类加一个静态属性years。
然后序列化:
Coder coder = new Coder();
coder.name = "kuang";
coder.age = 27;
coder.lang = "java";
coder.sex = 1;
Coder.years = 6;
try {
FileOutputStream fs = new FileOutputStream("./coder.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(coder);
} catch (IOException e) {
e.printStackTrace();
}