Java 中的 transient 關鍵字

Mohammad Irfan 2023年1月30日 2022年5月11日
  1. 在 Java 中建立瞬態變數
  2. 在 Java 中的 Hibernate 實體類中建立瞬態變數
Java 中的 transient 關鍵字

本教程介紹了 transient 關鍵字是什麼以及如何在 Java 應用程式中使用它。

Transient 是 Java 中的一個關鍵字,用於將變數標記為不可序列化。當我們序列化一個物件時使用它。

序列化是將 Java 物件轉換為位元組流的過程。所以,它可以被持久化到一個檔案中,當我們想要避免任何欄位持久化到一個檔案中時,我們標記那個瞬態。

我們不能將任何方法標記為瞬態,而只能標記欄位。讓我們通過一些例子來理解。

要使類可序列化,我們首先需要實現 Seriablizable 介面,然後對變數使用瞬態關鍵字。下面是一個實現 Serializable 介面的可序列化類示例。但是,它不標記任何場瞬態。

class Student implements Serializable{
	/*
	 *  non- transient fields
	 */
	int id;
	String name;
	String email;  
}

在 Java 中建立瞬態變數

在這個例子中,我們有一個類 Student,它實現了 Serializable 介面並將電子郵件標記為瞬態。因此,當我們將其狀態寫入檔案時,只會將 nameid 寫入檔案。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;
	}
}