Le mot-clé transient est utilisé en Java pour indiquer les champs d'une classe qui doivent être exclus du processus de sérialisation – c'est-à-dire que ces champs ne seront pas sauvegardés lors de la sauvegarde d'un objet dans un flux de bytes.
C'est utile lorsque :
Exemple d'utilisation :
import java.io.*; class User implements Serializable { private String username; private transient String password; // ne sera pas sérialisé public User(String username, String password) { this.username = username; this.password = password; } }
Après la désérialisation, le champ password aura la valeur null.
Que se passe-t-il si un champ transient est une référence à un objet qui est lui-même Serializable ?
Réponse : Le champ ne sera néanmoins pas sérialisé – cela concerne le champ, et non le type de l'objet. Même si l'objet implémente Serializable, si le champ est marqué transient, il ne sera pas inclus dans la sérialisation de l'objet où il est transient.
Exemple :
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
Le champ credentials sera toujours null après la désérialisation, même si Credentials est sérialisable.
Histoire
Dans une banque en ligne, lors de la conception de l'objet "Session utilisateur", on a oublié de déclarer le champ de la session d'authentification comme transient, ce qui a conduit à la journalisation des objets sérialisés avec des informations confidentielles dans un fichier. Cela a entraîné une fuite de données personnelles.
Histoire
Dans un service de courtage, certains champs du cache ont été sérialisés par défaut. Après la restauration de l'état sérialisé, l'application a commencé à utiliser des données périmées du cache, ce qui a entraîné un écart entre les montants réels et ceux affichés sur les comptes.
Histoire
Un développeur a implémenté un champ transient, pensant que la valeur serait automatiquement remplie après la désérialisation. Il n'a pas implémenté de structure personnalisée (readObject/writeObject), et le champ est resté null – le programme s'est arrêté de manière inattendue lors du premier accès à ce champ.