淺談實體類為什么要實現Serializable接口?


序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象;序列化保存對象轉態,不保存靜態變量。

三種情況:

1. 將對象存儲在硬盤上。

2. 將對象通過網絡傳輸。

3. 通過RMI遠程調用等方式傳輸對象的時候。

在這三種情況下,是需要進行序列化然后傳輸的。

 

1、其實序列化,它是完整的保存了某一狀態下的對象信息,是一個整體,而不是零散的!我在一個IBM工程師的博客里面看到一個說法,我感覺對於我理解序列化很有幫助,他說序列化的過程,就是一個“freeze”的過程,它將一個對象freeze住,然后進行存儲,等到再次需要的時候,再將這個對象de-freeze就可以立即使用。

2、而像int、long、boolean類型等,都是基本數據類型,數據庫里面有與之對應的數據結構。從類聲明來看,我們以為的沒有進行序列化,其實是在聲明的各個不同變量的時候,由具體的數據類型幫助我們實現了序列化操作。所以就算我們不實現serializable依舊可以正常操作。

 

這時候,就又有一個問題,既然實體類的變量都已經幫助我們實現了序列化,為什么我們仍然要顯示的讓類實現serializable接口呢?

 

首先,序列化的目的有兩個,第一個是便於存儲,第二個是便於傳輸。我們一般的實體類不需要程序員再次實現序列化的時候,請想兩個問題:第一:存儲媒體里面,是否是有其相對應的數據結構?第二:這個實體類,是否需要遠程傳輸(或者兩個不同系統甚至是分布式模塊之間的調用)?

如果有注意觀察的話,發現序列化操作用於存儲時,一般是對於NoSql數據庫,而在使用Nosql數據庫進行存儲時,用“freeze”這個說法來理解是再恰當不過了,請在NoSql數據庫中,給我找出個varchar,int之類的數據結構出來? 如果沒有,但我們又確實需要進行存儲,那么,此時程序員再不將對象進行序列化,更待何時?

備注:如果有人打開過Serializable接口的源碼,就會發現,這個接口其實是個空接口,那么這個序列化操作,到底是由誰去實現了呢?其實,看一下接口的注釋說明就知道,當我們讓實體類實現Serializable接口時,其實是在告訴JVM此類可被序列化,可被默認的序列化機制序列化。

然后,需要說明的是,當我們在實體類聲明實現Serializable接口時,再次進行觀察,會發現這些類是需要被遠程調用的。也就是說需要或者可能需要被遠程調用,這就是序列化便於傳輸的用途。


免責聲明!

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



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