【序列化】Serializable之SerialVersionUID

Serializable 

可序列化接口,打開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;
}
相關文章
相關標籤/搜索