首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java transient 關鍵字詳解:序列化排除與最佳實踐

     編輯:Java 相關知識

作用

transient 修飾實例變量,標記該字段**不參與 Java 默認序列化過程**。反序列化時,該字段將被賦予默認值 (對象為 null,基本類型為 0/false)。

代碼演示

import java.io.*;

public class TransientDemo implements Serializable {
    private static final long serialVersionUID = 1L;
    private transient String name; // 不序列化
    private String password;       // 序列化

    public TransientDemo(String name, String password) {
        this.name = name; this.password = password;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        TransientDemo obj = new TransientDemo("張三", "123456");
        File file = new File("obj.ser");

        // 序列化
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
            oos.writeObject(obj);
        }

        // 反序列化
        TransientDemo restored;
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
            restored = (TransientDemo) ois.readObject();
        }

        System.out.println("name: " + restored.name);     // null (被 transient 排除)
        System.out.println("password: " + restored.password); // 123456 (保留)
    }
}

進階:自定義序列化控制 transient 字段

若需 transient 字段也能序列化 (如加密存儲、衍生計算),可實現 writeObject/readObject:

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject();
    out.writeObject(encrypt(name)); // 手動寫入加密後的 name
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    this.name = decrypt((String) in.readObject()); // 手動讀取解密
}

適用場景

  • 敏感數據:密碼、Token、密鑰 (不應持久化,或加密後單獨存儲)。
  • 運行時衍生字段:緩存值、計算結果、非持久化狀態 (如 logger, thread, socket)。
  • 非序列化第三方對象:引用的對象未實現 Serializable,標記 transient 避免 NotSerializableException。
  • 性能優化:大對象圖中排除不必要字段,減小序列化體積。

注意事項

  • 僅對默認序列化生效:JSON (Jackson/Gson)、XML (JAXB)、Protobuf 等有自己的忽略註解 (@JsonIgnore, @XmlTransient)。
  • static 字段本身不序列化,加不加 transient 效果相同。
  • final transient 字段反序列化後不會恢復構造器賦值 (因默認序列化不調用構造器),需在 readObject 中手動初始化。

總結

transient 是 Java 序列化的「開關」,用好它保護敏感信息、避免序列化失敗、優化傳輸體積。記住:**默認序列化只看非 transient 非 static 實例字段**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved