實體類為啥要序列化

星仔0發表於2024-06-05

實體類實現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介面時,再次進行觀察,會發現這些類是需要被遠端呼叫的。也就是說需要或者可能需要被遠端呼叫,這就是序列化便於傳輸的用途。

2,什麼情況下會用到序列化?

1,當你想把記憶體中的物件寫入到硬碟時

2,當你想用套接字在網路上傳輸物件時

3,當你想透過RMI呼叫物件時

(RMI是什麼東西?):RMI總結來說就是遠端呼叫物件,在一個jvm上呼叫另一個jvm的物件。

3,序列化需要注意的事項

1,序列化只儲存物件的狀態,而不管物件的方法。

2,當一個父類實現了序列化,它的子類也自動實現序列化,不用顯示進行實現了。

3,當一個例項物件引用其他物件,當序列化該物件時也把引用的物件進行了例項化。

本人新手,肯定有理解錯誤的地方,還請大家不吝賜教,多多給予批評指正!
萬般感謝!!!

轉自>https://www.cnblogs.com/jap6/p/10552646.html

相關文章