被遺忘的Java關鍵字:transient

不一樣的科技宅發表於2023-05-02

前言

  今天在看專案程式碼時候,看到了下面這樣一行程式碼,用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 的類,並在其中定義了兩個欄位 nameage,其中 age 被標記為 transient。然後,我們建立了一個 Example 物件並將其序列化到名為 example.ser 的檔案中。

  接著,我們從檔案中反序列化了剛剛序列化的 Example 物件,並將其賦值給一個新的物件 newObj。然後,我們列印出了原始物件和反序列化後的物件。可以看到,在反序列化後,age 欄位的值被恢復為其預設值 0。

使用場景

序列化敏感資料

  有些物件包含一些敏感資訊,如密碼、訪問令牌等,這些資訊在物件序列化時需要被保護,以防被未授權的使用者訪問和洩露。

提高序列化效能

  有些物件中的欄位可能會影響序列化和反序列化的效能,如包含大量資料的物件,這些資料可能會在網路傳輸或磁碟儲存期間增加延遲和負載,使用 transient 關鍵字可以排除這些欄位,提高序列化效能。

臨時資料

  有些欄位僅用於物件的內部計算或臨時儲存資料,這些資料在序列化時無需保留,因此可以使用 transient 關鍵字來忽略這些欄位,從而減少序列化後物件的大小。

需要注意的點

  • transient關鍵字只能修飾變數,而不能修飾方法和類。
  • transient標記的變數所在的類必須實現Serializable介面。
  • transient標記的變數在反序列化時會被初始化為預設值,需要在程式中手動進行初始化操作。

總結

  transient 關鍵字只是暫時地在序列化過程中忽略了該欄位,而不是永久性地從物件中刪除該欄位。在反序列化時,該欄位將被恢復為其預設值。因此,如果需要永久地從物件中刪除一個欄位,直接將其從類中完全刪除。

應該很少有人,會在專案中使用這個關鍵字吧,所以它值得被遺忘???。

結尾

  如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。

  我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!

相關文章