前言
今天在看專案程式碼時候,看到了下面這樣一行程式碼,用transient
修飾了一個變數,主要作用是做一個全域性開關。說實話我是第一次看到這個關鍵字。激發了我的好奇心,所以就瞭解一下這是何方神聖。
/**
* 全域性開關
*/
public static transient boolean running = true;
transient 是什麼?
在 Java 中,transient 是一個關鍵字,用於指定一個類的欄位(成員變數)在序列化時應該被忽略。在 Java 物件序列化期間,物件的狀態被轉換為位元組流,以便在網路上傳輸或持久儲存到磁碟。如果一個欄位被標記為 transient,那麼它的值不會被序列化,在反序列化時會被恢復其預設值。
簡單示例
public class Example implements Serializable {
private String name;
private transient int age;
public Example(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Example{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) throws Exception {
String dir = "/Users/ryan/Desktop/";
// 建立一個Example物件並序列化到檔案
Example obj = new Example("Ryan", 20);
System.out.println("Before serialization: " + obj);
OutputStream outputStream = Files.newOutputStream(Paths.get(dir + "example.ser"));
try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) {
out.writeObject(obj);
}
// 從檔案中反序列化Example物件
InputStream inputStream = Files.newInputStream(Paths.get(dir + "example.ser"));
try (ObjectInputStream in = new ObjectInputStream(inputStream)) {
System.out.println("After deserialization: " + in.readObject());
}
}
}
執行結果:
Before serialization: Example{name='Ryan', age=20}
After deserialization: Example{name='Ryan', age=0}
在上述示例中,我們建立了一個名為 Example
的類,並在其中定義了兩個欄位 name
和 age
,其中 age
被標記為 transient
。然後,我們建立了一個 Example
物件並將其序列化到名為 example.ser
的檔案中。
接著,我們從檔案中反序列化了剛剛序列化的 Example
物件,並將其賦值給一個新的物件 newObj
。然後,我們列印出了原始物件和反序列化後的物件。可以看到,在反序列化後,age
欄位的值被恢復為其預設值 0。
使用場景
序列化敏感資料
有些物件包含一些敏感資訊,如密碼、訪問令牌等,這些資訊在物件序列化時需要被保護,以防被未授權的使用者訪問和洩露。
提高序列化效能
有些物件中的欄位可能會影響序列化和反序列化的效能,如包含大量資料的物件,這些資料可能會在網路傳輸或磁碟儲存期間增加延遲和負載,使用 transient 關鍵字可以排除這些欄位,提高序列化效能。
臨時資料
有些欄位僅用於物件的內部計算或臨時儲存資料,這些資料在序列化時無需保留,因此可以使用 transient 關鍵字來忽略這些欄位,從而減少序列化後物件的大小。
需要注意的點
- transient關鍵字只能修飾變數,而不能修飾方法和類。
- transient標記的變數所在的類必須實現Serializable介面。
- transient標記的變數在反序列化時會被初始化為預設值,需要在程式中手動進行初始化操作。
總結
transient 關鍵字只是暫時地在序列化過程中忽略了該欄位,而不是永久性地從物件中刪除該欄位。在反序列化時,該欄位將被恢復為其預設值。因此,如果需要永久地從物件中刪除一個欄位,直接將其從類中完全刪除。
應該很少有人,會在專案中使用這個關鍵字吧,所以它值得被遺忘???。
結尾
如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。
我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!