在開發過程中,看到java類不管是vo,dto,還是po類都需要實現java.io.Serializable 這個沒有屬性和方法的空接口(public interface Serializable {})。vo類實現如public class SemesterVo implements Serializable {代碼...}。
此時個人也是百思不得其解,因為既然是空接口,還有什么好實現的。
經過研究才知道。我們要明白:
1.什么是Serializable接口?
一個對象序列化的接口。一個類只有實現了Serializable接口,它的對象才能被序列化。
2.什么是序列化?
將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。
程序的運行機制是:程序在運行時實例化出對象,這些對象存在於內存中,隨着程序運行停止而消失(也就是匿名對象將會被垃圾回收器回收掉,這是堆內存的知識,對象存儲在堆內存中),但如果我們想把某些對象(一般都是各不相同的屬性)保存下來或者傳輸給其他進程,在程序終止運行后這些對象仍然存在,可以在程序再次運行時讀取這些對象的信息,或者在其他程序中利用這些保存下來的對象信息恢復成實例對象。這種情況下就要用到對象的序列化和反序列化。
在序列化期間,對象將其當前狀態寫入到臨時存儲區或持久性存儲區,之后,便可以通過從存儲區中讀取或反序列化對象的狀態信息,來重新創建該對象。
實現Serializable和不實現該接口的區別就是:
想要序列化某些類的對象,這些類就必須實現Serializable接口。
Serializable這個空接口作用:目的只是簡單的標識一個類的對象可以被序列化。
那么什么情況下才需要實例化該接口呢?
a)當你想把的內存中的對象寫入到硬盤的時候;
b)當你想用套接字在網絡上傳送對象的時候(另一個說法就是當我們需要把對象的狀態信息通過網絡進行傳輸,或者需要將對象的狀態信息持久化,以便將來使用時都需要把對象進行序列化。);
c)當你想通過RMI傳輸對象的時候;
分別解釋下這三個場景下的使用:
a)比如說你的內存不夠用了,那計算機就要將內存里面的一部分對象暫時的保存到硬盤中,等到要用的時候再讀入到內存中,硬盤的那部分存儲空間就是所謂的虛擬內存。在比如過你要將某個特定的對象保存到文件中,我隔幾天在把它拿出來用,那么這時候就要實現Serializable接口; b)在進行java的Socket編程的時候,你有時候可能要傳輸某一類的對象,那么也就要實現Serializable接口;最常見的你傳輸一個字符串,它是JDK里面的類,也實現了Serializable接口,所以可以在網絡上傳輸。 c)如果要通過遠程的方法調用(RMI)去調用一個遠程對象的方法,如在計算機A中調用另一台計算機B的對象的方法,那么你需要通過JNDI服務獲取計算機B目標對象的引用,將對象從B傳送到A,就需要實現序列化接口。
