Java 中對 Serializable 接口和 transient 關鍵字的理解

首先,咱們得知道什麼是序列化 (serializable)java

衆所周知,目前,數據在計算機內存的狀態老是趨向於轉瞬即逝的(transient),當咱們寫一段程序,人爲的或者非人爲的,咱們都應將無用的數據從內存裏清除。想象如下,當一個十字路口老是擠滿各類汽車,那麼這個路口的交通情況會變得很是糟糕,清理內存實際上是爲了提升硬件的工做效率。Java 中的對象序列化是一個用於將對象狀態轉換爲字節流的過程,序列化是爲了保持對象在內存中的狀態,而且能夠把保存的對象狀態再讀出來。通俗的說,若是堆內存裏出現了一個對象,咱們想要將此對象長時間保存在相似硬盤的設備上或者經過網絡傳輸到其餘計算機上時,就得將此對象序列化,方便咱們下次使用,不然過一段時間後,Java 中的垃圾回收機制將會清除內存中的此對象。對象實在是個很抽象的概念,具化到計算機中,只是一堆數據而已,咱們習慣用這些數據去描述某個對象(如某我的的姓名、身高、體重等等)。安全

Serializable 接口是個標識接口網絡

public interface Serializable {
}

看源碼後咱們知道,這個接口裏什麼方法都未被定義。若某類的對象須要序列化,則該類應該實現 Serializable 接口session

何時須要用到序列化?併發

目前常常碰到的情況基本有如下兩種:code

一、數據持久化:好比一個電商平臺,有數萬個用戶併發訪問的時候會產生數萬個 session 對象,這個時候內存的壓力是很大的。咱們能夠把 session 對象序列化到硬盤中,須要時再反序列化,減小內存壓力。對象

二、網絡傳輸:咱們將系統拆分紅多個服務以後,服務之間傳輸對象,無論是何種類型的數據,都必需要轉成二進制流來傳輸,接受方收到後再轉爲數據對象。接口

transient 關鍵字內存

transient 修飾符僅適用於成員變量,不適用於局部變量、方法和類。在序列化時,若是咱們不想序列化某個成員變量以知足某些需求(如安全需求),那麼應該將該變量聲明爲 transient 。執行序列化時,JVM 會忽略 transient 變量的初始值並將成員變量的默認值保存到某個文件中。所以,transient 意味着不參與序列化。源碼

transient 和 static、final

Java 中,靜態變量不是某類中某個特定對象的具體描述(屬性),只有堆內存的數據會參與序列化,而靜態變量存放在 datasegment 中,因此它並不參與序列化。將靜態變量修飾爲 transient 是沒有任何做用的(寫成 transient static int k 編譯時不會報錯)。

final 修飾的成員變量必定會參與序列化(仍是在堆內存中),因此用 transient 修飾 final 變量不會產生任何影響( transient final int k 編譯時不會報錯)。

小小總結,到此爲止。

相關文章
相關標籤/搜索