Accéder au contenu principal
Documents
Tableaux JavaProgrammation orientée objet en JavaTraitement des fichiers en JavaIntroduction To JavaLes bases du langage JavaMots-clés Java

mot-clé transitoire en Java

Le mot-clé transient en Java est utilisé pour indiquer qu'un champ particulier d'une classe ne doit pas être sérialisé. La sérialisation est le processus de conversion de l'état d'un objet en un flux d'octets, qui peut ensuite être converti en une copie de l'objet. Les champs marqués comme transient sont ignorés au cours de ce processus.

Utilisation

Le mot-clé transient est utilisé dans les scénarios où certaines parties de l'état d'un objet ne doivent pas être sauvegardées ou transférées, comme les informations sensibles, les données temporaires ou les données qui peuvent être facilement recalculées.

Syntax

class ClassName implements Serializable {
    private transient dataType variableName;
}
  • dataType: Le type de données de la variable.
  • variableName: Le nom de la variable à marquer comme transient.

Exemples

Exemple 1 : Utilisation de base

import java.io.*;

class User implements Serializable {
    private String username;
    private transient String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "Username: " + username + ", Password: " + password;
    }
}

public class TransientExample {
    public static void main(String[] args) {
        User user = new User("john_doe", "secret123");

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"));
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {

            oos.writeObject(user);

            User deserializedUser = (User) ois.readObject();
            System.out.println("Deserialized User: " + deserializedUser);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Dans cet exemple, la classe User implémente Serializable, et le champ password est marqué comme transient. Lorsque l'objet User est sérialisé puis désérialisé, le champ password n'est pas restauré, ce qui démontre l'effet du mot-clé transient.

Exemple 2 : Transitoire dans un objet complexe

import java.io.*;

class Session implements Serializable {
    private String sessionId;
    private transient long lastAccessTime;

    public Session(String sessionId, long lastAccessTime) {
        this.sessionId = sessionId;
        this.lastAccessTime = lastAccessTime;
    }

    @Override
    public String toString() {
        return "Session ID: " + sessionId + ", Last Access Time: " + lastAccessTime;
    }
}

public class TransientComplexExample {
    public static void main(String[] args) {
        Session session = new Session("ABC123", System.currentTimeMillis());

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("session.ser"));
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream("session.ser"))) {

            oos.writeObject(session);

            Session deserializedSession = (Session) ois.readObject();
            System.out.println("Deserialized Session: " + deserializedSession);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Dans cet exemple, la classe Session possède un champ transient lastAccessTime . Après la sérialisation et la désérialisation, le site lastAccessTime n'est pas restauré et sa valeur par défaut (0) est imprimée.

Conseils et bonnes pratiques

  • Données sensibles: Utilisez transient pour éviter que des données sensibles (mots de passe, numéros de carte de crédit, etc.) ne soient sérialisées.
  • Données temporaires: Marquez les champs comme transient s'ils contiennent des données temporaires qui peuvent être recalculées ou qui ne doivent pas être conservées.
  • Valeurs par défaut: N'oubliez pas que les champs transient seront initialisés à leurs valeurs par défaut (par exemple, 0 pour les types numériques, null pour les références d'objets) lors de la désérialisation.
  • Sérialisation personnalisée: Si vous avez besoin de plus de contrôle sur le processus de sérialisation, envisagez d'implémenter les méthodes writeObject et readObject.
    private void writeObject(ObjectOutputStream oos) throws IOException {
        oos.defaultWriteObject();
        // Custom serialization code
    }
    
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject();
        // Custom deserialization code
    }
  • Interface sérialisable: Assurez-vous que la classe implémente l'interface Serializable; dans le cas contraire, le mot-clé transient n'a aucun effet.
  • Test: Testez toujours le processus de sérialisation et de désérialisation pour vérifier que les champs transient sont traités comme prévu.
  • Champs statiques: Notez que les champs statiques ne sont pas sérialisés car ils appartiennent à la classe et non à une instance spécifique. Par conséquent, le fait de les marquer comme transient n'a aucun effet.

Apprendre l'essentiel de Java

Développez vos compétences en Java à partir de la base et maîtrisez les concepts de programmation.
Commencez à apprendre gratuitement