可序列化接口,打開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;
}