java.io.Serializable的作用
Serializable,之前一直有使用,預設的實體類就會實現Serializable介面,對具體原因一直不是很瞭解,同時如果沒有實現序列化,同樣沒什麼影響,什麼時候應該進行序列化操作呢?今天查了下資料,大致總結一下。
1、其實序列化,它是完整的儲存了某一狀態下的物件資訊,是一個整體,而不是零散的!我在一個IBM工程師的部落格裡面看到一個說法,我感覺對於我理解序列化很有幫助,他說序列化的過程,就是一個“freeze”的過程,它將一個物件freeze住,然後進行儲存,等到再次需要的時候,再將這個物件de-freeze就可以立即使用。
2、而像int、long、boolean型別等,都是基本資料型別,資料庫裡面有與之對應的資料結構。從類宣告來看,我們以為的沒有進行序列化,其實是在宣告的各個不同變數的時候,由具體的資料型別幫助我們實現了序列化操作。所以就算我們不實現serializable依舊可以正常操作。
這時候,就又有一個問題,既然實體類的變數都已經幫助我們實現了序列化,為什麼我們仍然要顯示的讓類實現serializable介面呢?
首先,序列化的目的有兩個,第一個是便於儲存,第二個是便於傳輸。我們一般的實體類不需要程式設計師再次實現序列化的時候,請想兩個問題:第一:儲存媒體裡面,是否是有其相對應的資料結構?第二:這個實體類,是否需要遠端傳輸(或者兩個不同系統甚至是分散式模組之間的呼叫)?
如果有注意觀察的話,發現序列化操作用於儲存時,一般是對於NoSql資料庫,而在使用Nosql資料庫進行儲存時,用“freeze”這個說法來理解是再恰當不過了,請在NoSql資料庫中,給我找出個varchar,int之類的資料結構出來? 如果沒有,但我們又確實需要進行儲存,那麼,此時程式設計師再不將物件進行序列化,更待何時?
備註:如果有人開啟過Serializable介面的原始碼,就會發現,這個介面其實是個空介面,那麼這個序列化操作,到底是由誰去實現了呢?其實,看一下介面的註釋說明就知道,當我們讓實體類實現Serializable介面時,其實是在告訴JVM此類可被序列化,可被預設的序列化機制序列化。
然後,需要說明的是,當我們在實體類宣告實現Serializable介面時,再次進行觀察,會發現這些類是需要被遠端呼叫的。也就是說需要或者可能需要被遠端呼叫,這就是序列化便於傳輸的用途。