ProgrammazioneSviluppatore Java

Как работает ключевое слово 'transient' в Java? Объясните его назначение и особенности использования при сериализации объектов.

Supera i colloqui con l'assistente IA Hintsage

Ответ

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:

  • Il campo contiene dati sensibili (ad esempio, password)
  • Il campo può essere ripristinato dopo la deserializzazione
  • Lo stato del campo è specifico per la JVM e non è necessario trasferirlo tra JVM

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.

Domanda trabocchetto

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.

Esempi di errori reali a causa della mancata conoscenza delle sfumature dell'argomento


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.