在Java中,transient
關鍵字用于修飾一個類的成員變量,表示該成員變量不會被默認的序列化機制所序列化。
當一個對象被序列化時,其所有的成員變量都會被序列化,然后才能被傳輸或保存到磁盤上。但有時候某些成員變量并不需要被序列化,例如敏感信息或不重要的臨時數據。在這種情況下,可以使用transient
關鍵字來標記這些成員變量,使得它們不會被序列化。
使用transient
關鍵字修飾的成員變量將在序列化過程中被忽略。當對象被反序列化時,這些成員變量的值將恢復為默認值(例如數值類型為0,引用類型為null)。
下面是一個示例:
import java.io.Serializable;
public class Person implements Serializable {
private String name; // 會被序列化
private transient String password; // 不會被序列化
// 構造方法,getter和setter等省略...
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
在上面的例子中,name
成員變量會被序列化,而password
成員變量被transient
修飾,不會被序列化。當將一個Person
對象序列化后,password
字段會被忽略。
import java.io.*;
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", "123456");
// 序列化對象
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化對象
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person deserializedPerson = (Person) in.readObject();
System.out.println(deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在上面的例子中,Person
對象被序列化后保存到person.ser
文件中。然后,再從該文件中反序列化得到對象,并打印出來。可以觀察到反序列化后的對象的password
字段值為null
,而name
字段值為Alice
。