可序列化接口,打开jdk java.io Serializable,发现,Serializable下没有任何的实现,咱们称这样的接口为标志性接口 ,若是某对象,不实现Serializable会报没有序列化异常java
http://tool.oschina.net/apidocs/apidoc?api=jdk-zhapi
Exception in thread "main" java.io.NotSerializableException: src.main.java.com.Io.user.Useride
序列化,数据从内存到硬盘 this
反序列化:数据从硬盘到内存spa
某个对象实现了Serializable,java虚拟机会对加上Serializable的对象作一些特殊的处理,就是加上版本号SerialversionUID(java虚拟机的特殊照顾,加上SerialversionUID).net
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;
}