Java 中的 transient 關鍵字
Mohammad Irfan
2023年1月30日
2022年5月11日
本教程介紹了 transient 關鍵字是什麼以及如何在 Java 應用程式中使用它。
Transient 是 Java 中的一個關鍵字,用於將變數標記為不可序列化。當我們序列化一個物件時使用它。
序列化是將 Java 物件轉換為位元組流的過程。所以,它可以被持久化到一個檔案中,當我們想要避免任何欄位持久化到一個檔案中時,我們標記那個瞬態。
我們不能將任何方法標記為瞬態,而只能標記欄位。讓我們通過一些例子來理解。
要使類可序列化,我們首先需要實現 Seriablizable
介面,然後對變數使用瞬態關鍵字。下面是一個實現 Serializable
介面的可序列化類示例。但是,它不標記任何場瞬態。
class Student implements Serializable{
/*
* non- transient fields
*/
int id;
String name;
String email;
}
在 Java 中建立瞬態變數
在這個例子中,我們有一個類 Student
,它實現了 Serializable
介面並將電子郵件標記為瞬態。因此,當我們將其狀態寫入檔案時,只會將 name
和 id
寫入檔案。email
資料未寫入。你可以通過讀取相同的檔案並將資料顯示到控制檯來驗證這一點。請參閱下面的示例。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SimpleTesting{
public static void main(String[] args) throws IOException, ClassNotFoundException{
Student student = new Student();
student.setId(10);
student.setName("Rohan");
student.setEmail("rohan@gmail.com");
// Writing to a file
FileOutputStream fileStream = new FileOutputStream("student.txt");
ObjectOutputStream outStream = new ObjectOutputStream(fileStream);
outStream.writeObject(student);
outStream.flush();
outStream.close();
fileStream.close();
// Reading file
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("student.txt"));
student = (Student)inputStream.readObject();
System.out.println(student.id+" "+student.name+" "+student.email);
System.out.println(Student.getSerialversionuid());
inputStream.close();
}
}
class Student implements Serializable{
private static final long serialVersionUID = 1L;
int id;
String name;
transient String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
輸出:
10 Rohan null 1
你可以在輸出中注意到電子郵件為空。
在 Java 中的 Hibernate 實體類中建立瞬態變數
如果你正在使用 hibernate 並希望使某些變數/欄位成為瞬態,請使用 @Transient
修飾符。它將跳過將資料寫入資料庫表。此註釋僅在你使用 hibernate 時有用,並且由於這是一個註釋,你必須將所有必需的 JAR 匯入到你的專案中。請參閱下面的示例。
@Entity
class Student implements Serializable{
@Id
int id;
String name;
@Transient
String email; //transient
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}