什麼是序列化
Java中對象的序列化指的是将對象轉換成以位元組序列的形式來表示,這些位元組序列包含了對象的資料和資訊,一個序列化後的對象可以被寫到資料庫或檔案中,也可用于網絡傳輸,一般當我們使用緩存cache(記憶體空間不夠有可能會本地存儲到硬碟)或遠端調用rpc(網絡傳輸)的時候,經常需要讓我們的實體類實作Serializable接口,目的就是為了讓其可序列化。
當然,序列化後的最終目的是為了反序列化,恢複成原先的Java對象,要不然序列化後幹嘛呢,是以序列化後的位元組序列都是可以恢複成Java對象的,這個過程就是反序列化。
關于transient關鍵字
Java中transient關鍵字的作用,簡單地說,就是讓某些被修飾的成員屬性變量不被序列化,這一看好像很好了解,就是不被序列化,那麼什麼情況下,一個對象的某些字段不需要被序列化呢?如果有如下情況,可以考慮使用關鍵字transient修飾:
- 類中的字段值可以根據其它字段推導出來,如一個長方形類有三個屬性:長度、寬度、面積(示例而已,一般不會這樣設計),那麼在序列化的時候,面積這個屬性就沒必要被序列化了;
- 其它,看具體業務需求吧,哪些字段不想被序列化;
記得之前看HashMap源碼的時候,發現有個字段是用transient修飾的,我覺得還是有道理的,确實沒必要對這個modCount字段進行序列化,因為沒有意義,modCount主要用于判斷HashMap是否被修改(像put、remove操作的時候,modCount都會自增),對于這種變量,一開始可以為任何值,0當然也是可以(new出來、反序列化出來、或者克隆clone出來的時候都是為0的),沒必要持久化其值。
/**
* The number of times this HashMap has been structurally modified
* Structural modifications are those that change the number of mappings in
* the HashMap or otherwise modify its internal structure (e.g.,
* rehash). This field is used to make iterators on Collection-views of
* the HashMap fail-fast. (See ConcurrentModificationException).
*/
transient int modCount;
最後,為什麼要不被序列化呢,主要是為了節省存儲空間,其它的感覺沒啥好處,可能還有壞處(有些字段可能需要重新計算,初始化什麼的),總的來說,利大于弊
原文位址