Il keyword transient è utilizzato in Java per indicare i campi di una classe che devono essere esclusi dal processo di serializzazione – cioè, questi campi non verranno salvati quando si trasferisce un oggetto in un flusso di byte.
Questo è utile quando:
Esempio di utilizzo:
import java.io.*; class User implements Serializable { private String username; private transient String password; // non verrà serializzato public User(String username, String password) { this.username = username; this.password = password; } }
Dopo la deserializzazione, il campo password avrà valore null.
Cosa succede se un campo transient è un riferimento a un oggetto che implementa Serializable?
Risposta: Il campo non verrà comunque serializzato – questo si applica al campo, non al tipo dell'oggetto. Anche se l'oggetto implementa Serializable, se il campo è contrassegnato come transient, non verrà considerato nella serializzazione dell'oggetto a cui appartiene.
Esempio:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
Il campo credentials sarà sempre null dopo la deserializzazione, anche se Credentials è serializzabile.
Storia
In una banca online, durante la progettazione dell'oggetto "Sessione utente", è stato dimenticato di dichiarare il campo della sessione di autorizzazione come transient, il che ha portato a oggetti serializzati che venivano loggati insieme a informazioni riservate in un file. Questo ha portato a una fuga di dati personali.
Storia
In un servizio di brokeraggio, alcuni campi della cache sono stati serializzati per impostazione predefinita. Dopo il ripristino dallo stato serializzato, l'applicazione ha iniziato a utilizzare dati obsoleti dalla cache, causando discrepanze tra i saldi reali e quelli visualizzati.
Storia
Uno sviluppatore ha implementato un campo transient, supponendo che il valore sarebbe stato automaticamente popolato dopo la deserializzazione. Non ha implementato una struttura di lettura/scrittura personalizzata (readObject/writeObject), il che ha portato a mantenere il campo null – il programma si è arrestato in modo anomalo al primo accesso a questo campo.