Serializable
可序列化接口,打开jdk java.io Serializable,发现,Serializable下没有任何的实现,我们称这样的接口为标志性接口 ,如果某对象,不实现Serializable会报没有序列化异常
Exception in thread "main" java.io.NotSerializableException: src.main.java.com.Io.user.User
什么是序列化
序列化,数据从内存到硬盘
反序列化:数据从硬盘到内存
序列化版本
某个对象实现了Serializable,java虚拟机会对加上Serializable的对象做一些特殊的处理,就是加上版本号SerialversionUID
package src.main.java.com.Io.user; import java.io.Serializable; public class Person implements Serializable { }
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(); 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")); ois.readObject(); ois.close(); } }
这段代码本来没有问题,但是如果把Person.class删除,然后再次运行ObjectOutputStreamTest.java ,重新生成Person.class,这时候反序列化,是否可以成功,答案是不能,因为两次的SerialversionUID是不同的
怎么办
不让系统自动生成,而是手动写定一个序列化的版本号(重点)
public class Person implements Serializable { private static final long serialVersionUID = 1L; }