Java の transient キーワードは、クラス フィールドをシリアル化しないことを示すためにクラス フィールドに適用される修飾子です。オブジェクトがシリアル化されると、そのすべてのフィールドがバイト ストリームに変換されます。フィールドを一時的としてマークすると、シリアル化中にそのフィールドを無視するように Java 仮想マシン (JVM) に指示します。
パスワードなどの機密情報、またはキャッシュや派生値などの重要でないデータがシリアル化されるのを防ぐ場合は、transient キーワードの使用が不可欠です。これは、セキュリティとパフォーマンスの最適化の両方にとって非常に重要です。
例:
import java.io.Serializable; public class UserSession implements Serializable { private String userName; private transient String password; public UserSession(String userName, String password) { this.userName = userName; this.password = password; } @Override public String toString() { return "UserSession{" + "userName='" + userName + ''' + ", password='" + password + ''' + '}'; } }
この例では、 password は transient としてマークされているため、 UserSession オブジェクトと一緒にシリアル化されません。
transient キーワードを最大限に活用するには、その具体的な使用例と利点を理解することが重要です。
transient を使用する主な理由の 1 つは、シリアル化中に機密データを保護することです。たとえば、シリアル化されたオブジェクトにプレーンテキストのパスワードを保存すると、セキュリティ リスクが生じる可能性があります。これらのフィールドを transient としてマークすると、そのようなデータがシリアル化から確実に除外されます。
例:
// Serialization Process UserSession session = new UserSession("JohnDoe", "supersecret"); System.out.println("Before Serialization: " + session); FileOutputStream fileOut = new FileOutputStream("session.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(session); out.close(); fileOut.close(); // Deserialization Process FileInputStream fileIn = new FileInputStream("session.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); UserSession deserializedSession = (UserSession) in.readObject(); in.close(); fileIn.close(); System.out.println("After Deserialization: " + deserializedSession);
出力:
Before Serialization: UserSession{userName='JohnDoe', password='supersecret'} After Deserialization: UserSession{userName='JohnDoe', password='null'}
示されているように、パスワードは逆シリアル化後は保持されません。
クラスには、保存するのではなく再計算できるフィールドが含まれる場合があります。このようなフィールドを一時的としてマークすると、シリアル化されるデータの量が削減され、パフォーマンスが向上します。
スレッドなどの特定のオブジェクトは本質的にシリアル化できません。クラスにシリアル化可能ではないが永続化する必要がないフィールドがある場合、それらのフィールドを一時的としてマークすると、シリアル化の問題を防ぐことができます。
例:
public class TaskExecutor implements Serializable { private transient Thread thread; public TaskExecutor() { this.thread = new Thread(); } // Additional methods }
ここでは、スレッド オブジェクトはシリアル化できないため、スレッド フィールドは 一時的 としてマークされています。
transient キーワードは強力ですが、Java でシリアル化を制御する別のアプローチもあります。
詳しくは をご覧ください: Java の「Transient」キーワードの目的は何ですか?効果的な使い方は?
以上がJava における「Transient」キーワードの目的は何ですか?効果的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。