Java基礎之Serializable接口


Serializable接口介紹

Serializable是java.io包中定義的、用於實現Java類的序列化操作而提供的一個語義級別的接口。Serializable序列化接口沒有任何方法或者字段,只是用於標識可序列化的語義。實現了Serializable接口的類可以被ObjectOutputStream轉換為字節流,同時也可以通過ObjectInputStream再將其解析為對象。例如,我們可以將序列化對象寫入文件后,再次從文件中讀取它並反序列化成對象。簡單說就是為了保存在內存中的各種對象的狀態,並且可以把保存的對象狀態再讀出來。

序列化是指把對象轉換為字節序列的過程,我們稱之為對象的序列化,就是把內存中的這些對象變成一連串的字節(bytes)描述的過程。
而反序列化則相反,就是把持久化的字節文件數據恢復為對象的過程。

serialVersionUID介紹

對於JVM來說,要進行持久化的類必須要有一個標記,只有持有這個標記JVM才允許類創建的對象可以通過其IO系統轉換為字節數據,從而實現持久化,而這個標記就是Serializable接口。而在反序列化的過程中則需要使用serialVersionUID來確定由那個類來加載這個對象,所以我們在實現Serializable接口的時候,一般還會去顯示地定義serialVersionUID。在反序列化的過程中,如果接收方為一個類的對象聲明,如果該對象的serialVersionUID與待反序列化的對象不同,那么反序列化的過程中將會導致InvalidClassException異常。

查看源碼

package java.io;
public interface Serializable {

}

測試代碼

Person類

import java.io.Serializable;
public class Person implements Serializable {
	private static final long serialVersionUID = 8241970228716425282L;	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}

測試類

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		p.setName("feige");
		writeObj(p);		
		Person p2 = readObj();
		System.out.println(p2);
	}
	
     // 序列化
	public static void writeObj(Person p) {  
        try { 
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E://1.txt")); 
            objectOutputStream.writeObject(p); 
            objectOutputStream.close(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 

    // 反序列化	
    public static Person readObj() { 
    	Person p = null;
        try { 
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E://1.txt")); 
            try { 
            	p = (Person)objectInputStream.readObject(); 
            } catch (ClassNotFoundException e) { 
                e.printStackTrace(); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        return p;
    } 
}

控制台輸出:Person [name=feige]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM