Serializable,之前一直有使用,默認的實體類就會實現Serializable接口,對具體原因一直不是很了解,
同時如果沒有實現序列化,同樣沒什么影響,什么時候應該進行序列化操作呢?今天查了下資料,大致總結一下。
首先,什么是序列化?
其實序列化,它是完整的保存了某一狀態下的對象信息,是一個整體,而不是零散的!我在一個IBM工程師的博客里面看到一個說法,我感覺對於我理解序列化很有幫助,他說序列化的過程,就是一個“freeze”的過程,它將一個對象freeze住,然后進行存儲,等到再次需要的時候,再將這個對象de-freeze就可以立即使用。
而像int、long、boolean類型等,都是基本數據類型,數據庫里面有與之對應的數據結構。從類聲明來看,我們以為的沒有進行序列化,其實是在聲明的各個不同變量的時候,由具體的數據類型幫助我們實現了序列化操作。所以就算我們不實現serializable依舊可以正常操作。
這時候,就又有一個問題,既然實體類的變量都已經幫助我們實現了序列化,為什么我們仍然要顯示的讓類實現serializable接口呢?
為什么要進行序列化?
存儲對象在存儲介質中,以便在下次使用的時候,可以很快捷的重建一個副本;
便於數據傳輸,尤其是在遠程調用的時候!
序列化的作用(目的)?
序列化的目的有兩個,第一個是便於存儲,第二個是便於傳輸。我們一般的實體類不需要程序員再次實現序列化的時候,請想兩個問題:第一:存儲媒體里面,是否是有其相對應的數據結構?第二:這個實體類,是否需要遠程傳輸(或者兩個不同系統甚至是分布式模塊之間的調用)?
如果有注意觀察的話,發現序列化操作用於存儲時,一般是對於NoSql數據庫,而在使用Nosql數據庫進行存儲時,用“freeze”這個說法來理解是再恰當不過了,請在NoSql數據庫中,給我找出個varchar,int之類的數據結構出來? 如果沒有,但我們又確實需要進行存儲,那么,此時程序員再不將對象進行序列化,更待何時?
注意:
如果有人打開過Serializable接口的源碼,就會發現,這個接口其實是個空接口,那么這個序列化操作,到底是由誰去實現了呢?其實,看一下接口的注釋說明就知道,當我們讓實體類實現Serializable接口時,其實是在告訴JVM此類可被序列化,可被默認的序列化機制序列化。
然后,需要說明的是,當我們在實體類聲明實現Serializable接口時,再次進行觀察,會發現這些類是需要被遠程調用的。也就是說需要或者可能需要被遠程調用,這就是序列化便於傳輸的用途。