ProgrammationDéveloppeur Java

Comment fonctionne le mot-clé 'transient' en Java ? Expliquez son but et ses caractéristiques d'utilisation lors de la sérialisation des objets.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Le champ contient des données sensibles (par exemple, des mots de passe)
  • Le champ peut être reconstruit après la désérialisation
  • L'état du champ est spécifique à la JVM et n'a pas besoin d'être transmis entre les JVM

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.

Question piège

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.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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.