IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Persistance des données Java Discussion :

Serializable et chargement de classe


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Serializable et chargement de classe
    J'ai hésité à mettre cette question sur mon précédent post, mais en fait c'est bien une question distincte...

    Lorsqu'un attribut est déclaré transient, il n'est pas sérializé, et quand on charge la classe avec ObjectInputStream.readObject(), sa valeur est null (ou valeur par défaut pour les types primitifs).
    Y'a-t-il un moyen de récupérer une valeur prédéfinie lors du chargement, pour éviter de faire une méthode qui initialise ces valeurs?

    Un exemple concret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class A {
        private String name;
        private transient List<XListener> listeners;
        ...
        public A(String name) {
            this.name = name;
            listeners = new ArrayList<XListener>();
        }
        ...
        public void addXListener(XListener listener) {
            listeners.add(listener);
        }
        ...
    }
    Si listeners est null, ça pose un problème ^^

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu as deux solutions, grâce aux méthodes optionnelles de l'interface Serializable :

    1) Tu disposes en effet de deux méthodes writeObject()/readObject() permettant de modifier la manière dont l'objet est écrit ou lu.

    Tu peux ainsi utiliser la méthode readObject() pour effectuer des traitements supplémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        private void readObject(java.io.ObjectInputStream in)
            throws IOException, ClassNotFoundException {
     
            in.defaultReadObject(); // Lecture par défaut de l'objet
     
            this.listeners = new ArrayList<String>();
        }
    Explication : si la méthode readObject() est présente, elle est utilisé à la place de la lecture des champs par défaut de la sérialisation. Ici comme on veut conserver ce comportement on utilise la méthode defaultReadObject() pour effectuer cette lecture. Il ne reste plus qu'à initialiser les champs transient...




    2) Tu peux utiliser les méthodes writeReplace()/readReplace() pour envoyer/recevoir un objet différent. Pour la méthode readReplace(), elle est appellé après la lecture de l'objet dans le flux, mais avant que l'ObjectInputStream ne te renvoit la référence vers l'objet. Comme cette méthode est appellé sur l'instance créé depuis le flux, elle peut être utilisé pour initialiser des champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private Object readResolve() throws ObjectStreamException {
            this.listeners = new ArrayList<String>();
            return this; // on ne remplace pas l'objet (ou on le remplace par lui même)
        }
    a++

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    OK, merci, c'est génial ils ont pensé à tout dans Java

    Je vais modifier mes classes

    Résolu...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 02h43
  2. Chargement de classe via dlopen
    Par Higestromm dans le forum C++
    Réponses: 4
    Dernier message: 18/05/2006, 17h14
  3. [Applet] Problème chargement de classe
    Par simsky dans le forum Applets
    Réponses: 1
    Dernier message: 08/05/2006, 20h31
  4. [SunOne] Problème de chargement de classe Xerces sous SunOne
    Par cocula dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/01/2006, 16h46
  5. [Chargement de classe][noms de classe relatifs]
    Par freudy dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2004, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo