1. 程式人生 > 其它 >為什麼要實現Serializable

為什麼要實現Serializable

 

  工作中我們經常在進行持久化操作和返回資料時都會使用到javabean來統一封裝引數,方便操作,一般我們也都會實現Serializable介面,那麼問題來了,首先:為什麼要進行序列化;其次:每個實體bean都必須實現serializabel介面嗎?最後:我做一些專案的時候,沒有實現序列化,同樣沒什麼影響,到底什麼時候應該進行序列化操作呢?

  網上找了很多資料,但是感覺大都沒有說的很清楚,所以結合自己的理解做一下總結。

  首先第一個問題,實現序列化的兩個原因:1、將物件的狀態儲存在儲存媒體中以便可以在以後重新創建出完全相同的副本;2、按值將物件從一個應用程式域傳送至另一個應用程式域。實現serializabel介面的作用是就是可以把物件存到位元組流,然後可以恢復,所以你想如果你的物件沒實現序列化怎麼才能進行持久化和網路傳輸呢,要持久化和網路傳輸就得轉為位元組流,所以在分散式應用中及設計資料持久化的場景中,你就得實現序列化。

  第二個問題,是不是每個實體bean都要實現序列化,答案其實還要回歸到第一個問題,那就是你的bean是否需要持久化儲存媒體中以及是否需要傳輸給另一個應用,沒有的話就不需要,例如我們利用fastjson將實體類轉化成json字串時,並不涉及到轉化為位元組流,所以其實跟序列化沒有關係。

  第三個問題,有的時候並沒有實現序列化,依然可以持久化到資料庫。這個其實我們可以看看實體類中常用的資料型別,例如Date、String等等,它們已經實現了序列化,而一些基本型別,資料庫裡面有與之對應的資料結構,從我們的類宣告來看,我們沒有實現serializabel介面,其實是在宣告的各個不同變數的時候,由具體的資料型別幫助我們實現了序列化操作。

  另外需要注意的是,在NoSql資料庫中,並沒有與我們java基本型別對應的資料結構,所以在往nosql資料庫中儲存時,我們就必須將物件進行序列化,同時在網路傳輸中我們要注意到兩個應用中javabean的serialVersionUID要保持一致,不然就不能正常的進行反序列化。

  工作中我們經常在進行持久化操作和返回資料時都會使用到javabean來統一封裝引數,方便操作,一般我們也都會實現Serializable介面,那麼問題來了,首先:為什麼要進行序列化;其次:每個實體bean都必須實現serializabel介面嗎?最後:我做一些專案的時候,沒有實現序列化,同樣沒什麼影響,到底什麼時候應該進行序列化操作呢?

  網上找了很多資料,但是感覺大都沒有說的很清楚,所以結合自己的理解做一下總結。

  首先第一個問題,實現序列化的兩個原因:1、將物件的狀態儲存在儲存媒體中以便可以在以後重新創建出完全相同的副本;2、按值將物件從一個應用程式域傳送至另一個應用程式域。實現serializabel介面的作用是就是可以把物件存到位元組流,然後可以恢復,所以你想如果你的物件沒實現序列化怎麼才能進行持久化和網路傳輸呢,要持久化和網路傳輸就得轉為位元組流,所以在分散式應用中及設計資料持久化的場景中,你就得實現序列化。

  第二個問題,是不是每個實體bean都要實現序列化,答案其實還要回歸到第一個問題,那就是你的bean是否需要持久化儲存媒體中以及是否需要傳輸給另一個應用,沒有的話就不需要,例如我們利用fastjson將實體類轉化成json字串時,並不涉及到轉化為位元組流,所以其實跟序列化沒有關係。

  第三個問題,有的時候並沒有實現序列化,依然可以持久化到資料庫。這個其實我們可以看看實體類中常用的資料型別,例如Date、String等等,它們已經實現了序列化,而一些基本型別,資料庫裡面有與之對應的資料結構,從我們的類宣告來看,我們沒有實現serializabel介面,其實是在宣告的各個不同變數的時候,由具體的資料型別幫助我們實現了序列化操作。

  另外需要注意的是,在NoSql資料庫中,並沒有與我們java基本型別對應的資料結構,所以在往nosql資料庫中儲存時,我們就必須將物件進行序列化,同時在網路傳輸中我們要注意到兩個應用中javabean的serialVersionUID要保持一致,不然就不能正常的進行反序列化。