工作中我們經常在進行持久化操作和返回數據時都會使用到javabean來統一封裝參數,方便操作,一般我們也都會實現Serializable接口,那么問題來了,首先:為什么要進行序列化;其次:每個實體bean都必須實現serializabel接口嗎?最后:我做一些項目的時候,沒有實現序列化,同樣沒什么影響,到底什么時候應該進行序列化操作呢?
網上找了很多資料,但是感覺大都沒有說的很清楚,所以結合自己的理解做一下總結。
首先第一個問題,實現序列化的兩個原因:1、將對象的狀態保存在存儲媒體中以便可以在以后重新創建出完全相同的副本;2、按值將對象從一個應用程序域發送至另一個應用程序域。實現serializabel接口的作用是就是可以把對象存到字節流,然后可以恢復,所以你想如果你的對象沒實現序列化怎么才能進行持久化和網絡傳輸呢,要持久化和網絡傳輸就得轉為字節流,所以在分布式應用中及設計數據持久化的場景中,你就得實現序列化。
第二個問題,是不是每個實體bean都要實現序列化,答案其實還要回歸到第一個問題,那就是你的bean是否需要持久化存儲媒體中以及是否需要傳輸給另一個應用,沒有的話就不需要,例如我們利用fastjson將實體類轉化成json字符串時,並不涉及到轉化為字節流,所以其實跟序列化沒有關系。
第三個問題,有的時候並沒有實現序列化,依然可以持久化到數據庫。這個其實我們可以看看實體類中常用的數據類型,例如Date、String等等,它們已經實現了序列化,而一些基本類型,數據庫里面有與之對應的數據結構,從我們的類聲明來看,我們沒有實現serializabel接口,其實是在聲明的各個不同變量的時候,由具體的數據類型幫助我們實現了序列化操作。
另外需要注意的是,在NoSql數據庫中,並沒有與我們java基本類型對應的數據結構,所以在往nosql數據庫中存儲時,我們就必須將對象進行序列化,同時在網絡傳輸中我們要注意到兩個應用中javabean的serialVersionUID要保持一致,不然就不能正常的進行反序列化。
