Das Schlüsselwort transient wird in Java verwendet, um Felder einer Klasse zu kennzeichnen, die aus dem Serialisierungsprozess ausgeschlossen werden sollen – das heißt, diese Felder werden beim Speichern des Objekts in einen Byte-Stream nicht gespeichert.
Dies ist nützlich, wenn:
Beispiel für die Verwendung:
import java.io.*; class User implements Serializable { private String username; private transient String password; // wird nicht serialisiert public User(String username, String password) { this.username = username; this.password = password; } }
Nach der Deserialisierung wird das Feld password den Wert null haben.
Was passiert, wenn das transient-Feld eine Referenz auf ein Objekt ist, das selbst Serializable implementiert?
Antwort: Das Feld wird dennoch nicht serialisiert – es bezieht sich auf das Feld und nicht auf den Typ des Objekts. Selbst wenn das Objekt Serializable implementiert, wird das Feld, das als transient gekennzeichnet ist, nicht in der Serialisierung des Objekts, in dem es transient ist, erfasst.
Beispiel:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
Das Feld credentials wird nach der Deserialisierung immer null sein, selbst wenn die Credentials selbst serialisierbar sind.
Geschichte
In einer Internetbank wurde beim Entwurf des Objekts „Benutzersitzung“ vergessen, das Authentifizierungssitzungsfeld als transient zu deklarieren, wodurch die serialisierten Objekte zusammen mit vertraulichen Informationen in eine Datei protokolliert wurden. Dies führte zu einem Datenleck.
Geschichte
In einem Brokerage-Dienst wurden einige Cache-Felder standardmäßig serialisiert. Nach der Wiederherstellung aus dem serialisierten Zustand begann die Anwendung, veraltete Daten aus dem Cache zu verwenden, was zu Diskrepanzen zwischen den tatsächlichen und den angezeigten Beträgen auf den Konten führte.
Geschichte
Ein Entwickler implementierte ein transient-Feld in der Annahme, dass der Wert nach der Deserialisierung automatisch ausgefüllt wird. Er implementierte keine benutzerdefinierte Struktur (readObject/writeObject), sodass das Feld null blieb – das Programm stürzte beim ersten Zugriff auf dieses Feld ab.