0Pricing
Java Academy · Leçon

Champs transient et serialVersionUID

Excluez les champs sensibles avec transient et préservez la compatibilité entre versions avec serialVersionUID.

Champs transient et serialVersionUID est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Pourquoi transient ?

Certains champs ne doivent pas être enregistrés : les mots de passe, les descripteurs de fichiers ouverts ou les calculs mis en cache. Marquez-les transient : ils seront ignorés pendant la sérialisation.

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

Valeur d’un champ transient après la désérialisation

Après la désérialisation, les champs transient reçoivent leur valeur par défaut Java : null pour les objets, 0 pour les nombres et false pour les booléens.

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

Qu’est-ce que serialVersionUID ?

serialVersionUID est une constante long qui sert de marqueur de version. Si la classe est modifiée et que l’UID ne correspond pas à celui enregistré dans le fichier, la désérialisation lève une InvalidClassException.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

UID généré automatiquement ou explicite

Si vous omettez serialVersionUID, Java en génère un à partir de la structure de la classe. Toute modification d’un champ modifie silencieusement l’UID et rend les anciennes données inutilisables. Déclarez-le toujours explicitement.

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

InvalidClassException en cas d’incompatibilité de version

Lors de la lecture d’anciennes données sérialisées avec une classe dont l’UID a changé, Java lève InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Évolution sûre des classes

Vous pouvez ajouter de nouveaux champs à une classe sérialisable sans modifier l’UID. Les anciens flux seront désérialisés avec la valeur par défaut pour le nouveau champ. Supprimer ou renommer des champs est plus risqué.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email; // Added in v2 — safe if UID unchanged
}

transient avec initialisation différée

Un schéma courant consiste à marquer un champ mis en cache ou dérivé transient, puis à le recalculer à la demande après la désérialisation à l’aide de readResolve ou dans l’accesseur.

public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    private String content;
    private transient int wordCount = -1;
    public int getWordCount() {
        if (wordCount == -1) wordCount = content.split("\\s+").length;
        return wordCount;
    }
}

Les champs static ne sont jamais sérialisés

Les champs static appartiennent à la classe, et non à l’instance. Ils ne sont jamais inclus dans le flux sérialisé : seuls les champs d’instance sont sérialisés.

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

Utiliser l’outil serialver

L’outil serialver du JDK affiche le serialVersionUID par défaut d’une classe : serialver com.example.User. Utilisez-le pour obtenir la valeur avant de l’ajouter explicitement.

La sérialisation externe comme alternative

Externalizable étend Serializable et offre un contrôle total grâce à writeExternal / readExternal ; cette solution est utile lorsque vous voulez contrôler explicitement les champs sans utiliser transient.

public class Config implements Externalizable {
    private String host;
    private transient String secret;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(host);
    }
    public void readExternal(ObjectInput in) throws IOException {
        host = in.readUTF();
    }
}

Bonnes pratiques

Déclarez toujours serialVersionUID. Marquez les mots de passe, les descripteurs et les données en cache avec transient. Incrémentez l’UID lorsque vous effectuez des modifications incompatibles. Documentez l’historique des versions.

Vérification rapide

Quelle valeur un champ int transient possède-t-il après la désérialisation ?

Récapitulatif

Utilisez transient pour exclure des champs de la sérialisation. Déclarez toujours serialVersionUID pour contrôler le versionnement. Les champs statiques ne sont jamais sérialisés, quoi qu’il arrive.

Questions Fréquemment Posées

La leçon « Champs transient et serialVersionUID » est-elle gratuite ?

Oui — le texte complet de « Champs transient et serialVersionUID » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Champs transient et serialVersionUID » ?

Excluez les champs sensibles avec transient et préservez la compatibilité entre versions avec serialVersionUID. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Champs transient et serialVersionUID » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Notions fondamentales de la sérialisation Java
  2. Champs transient et serialVersionUID
  3. Sérialisation personnalisée : writeObject et readObject
  4. Solutions modernes : JSON et Protocol Buffers
← Retour à Java Academy