Serializable
可序列化接口,打开jdk java.io Serializable,发现,Serializable下没有任何的实现,我们称这样的接口为标志性接口 ,如果某对象,不实现Serializable会报没有序列化异常
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
Exception in thread "main" java.io.NotSerializableException: src.main.java.com.Io.user.User
什么是序列化
序列化,数据从内存到硬盘
反序列化:数据从硬盘到内存
序列化版本
某个对象实现了Serializable,java虚拟机会对加上Serializable的对象做一些特殊的处理,就是加上版本号SerialversionUID(java虚拟机的特殊照顾,加上SerialversionUID)
package src.main.java.com.Io.user;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
public Person (String name) {
this.name= name;
}
@Override
public String toString() {
return "Person {" + "name='" + name+ '\'' + '}';
}
}
package src.main.java.com.Io.SerialVersionUIDTest;
import src.main.java.com.Io.user.Person;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamTest {
public static void main(String[] args) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));
Person person = new Person("lhx");
oos.writeObject(person);
oos.flush();
oos.close();
}
}
package src.main.java.com.Io.SerialVersionUIDTest;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class ObjectInputStreamTest02 {
public static void main(String[] args) throws Exception{
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));
Ojbect object=ois.readObject();
System.out.println(object);
ois.close();
}
}
这段代码本来没有问题,但是如果把Person.class删除,然后再次运行ObjectOutputStreamTest.java ,重新生成Person.class,这时候反序列化,是否可以成功,答案是不能,因为两次的SerialversionUID是不同的,下面是异常
java.io.InvalidClassException: com.master.CurrentMessages; local class incompatible:
stream classdesc serialVersionUID = -3227847930051618824,
local class serialVersionUID = -5813841892307787810
类中描述的serialVersionUID是-3227847930051618824 本地类中的是-5813841892307787810
两者不一致,导致的问题
怎么办
不让系统自动生成serialVersionUID ,而是手动写定一serialVersionUID (重点),
否则可能出现无法反序列化的问题
public class Person implements Serializable {
private static final long serialVersionUID = 5813841892307787810;
}