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

Langage Java Discussion :

Patch application lors de changements structure objets


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut Patch application lors de changements structure objets
    Bonjour,

    Je ne sais pas si le sujet a sa place ici, ou peut être dans la persistence...
    Ceci étant, je me posais une question quant à la maintenance d'une application dont on sauvegarde les données dans un fichier à l'aide d'un ObjectOutputStream.writeObject(monObjet). Dès lors que la structure des objets change, l'application ne peut plus lire les anciennes données.
    Je pensais passer par une petite appli qui s'occupe de patcher mes fichiers sauvegardés (en remplissant les nouveaux champs par des valeurs par défaut), cependant je voudrais savoir s'il existe d'autres moyens pour garantir la compatibilité d'une version à une autre de mon application ? Ou encore des frameworks dédiés à celà car l'idée est peut être là, mais je ne sais pas vraiment par quel bout prendre le problème !

    Merci d'avance !

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    De quel type de changement s'agit-il ?
    En règle général les changements sont supporté du mieux possible selon les cas (par exemple si un champs est ajouté, il vaudra null/zéro en cas de chargement d'une version plus ancienne).
    Et si besoin on peut définir des

    Maintenant pour quelque chose de plus souple on peut définir la méthode readResolve() afin de définir ces valeurs lorsqu'elles sont absentes...


    Sinon une autre solution serait de passer par les XMLEncoder/XMLDecoder qui se base sur les getter/setter...


    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Salut et merci de ta réponse (désolé du temps de réponse un peu long) pour en revenir à ce que tu proposes, en fait, actuellement, dès que j'opère un changement sur les classes qui composent les fichier que je lis pour regénérer mes objets, j'ai une InvalidClassException, j'ai trouvé une solution ici :
    http://java.developpez.com/faq/java/...ION_sansSerial

    Ceci étant, ça ne résoud pas totalement mon problème, bien qu'ayant fixé le serialVersionUID d'une de mes classes pour tester. En effet, j'obtiens maintenant une nouvelle exception dont voici la trace à partir de l'appel du "readObject()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java.io.EOFException
            at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570)
            at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
    Ca ne semble pas empecher la lecture de mon fichier, mais ça me chiffonne tout de même, quelqu'un aurait il une idée pour m'éclairer ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Petit up.

    J'ai mis en place des "private static final long serialVersionUID" aux classes que je sérialize ce qui me permet de lire mes fichiers "crits avec d'anciennes versions de mes classes.

    Cependant le problème est toujours là mais sous une autre forme.
    Mes objets bien créés, mais quand je souhaite accèder à un champs que j'ai ajouté dans la nouvelle version de ma classe, j'ai des NullPointerException car il semblerait que les nouveaux champs prennent par défaut la valeur "null" (jusque là pas de problème).

    Ceci étant, y a t'il possibilité de définir des valeurs par défaut autre que null lorsqu'un champs n'existe pas dans l'objet issus d'une ancienne version de ma classe ? Pour éviter d'avoir à ajouter des traitements spécifiques pour gérer le fonctionnement des différentes versions de classes ?
    Actuellement ça me pose problème car j'ai des nouveaux champs qui sont, entre autre, des ArrayLists sur lesquelles je boucle directement sans tester si elles sont nulles, car sensées êtres intialisées à "new ArrayList<Classe>()";

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Oups, désolé, j'en avais oublié ta proposition de readResolve, j'ai pu corriger mon problème avec, merci bien à toi, et désolé du post inutile du coup.

    Merci encore

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    J'avais déjà donné la réponse dans mon précédent post :
    Citation Envoyé par adiGuba Voir le message
    Maintenant pour quelque chose de plus souple on peut définir la méthode readResolve() afin de définir ces valeurs lorsqu'elles sont absentes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	private Object readResolve() throws ObjectStreamException {
    		if (this.list==null)
    			this.list = new ArrayList<String>();
    		// etc pour tous les champs "ajoutés" entre deux versions
    		return this;
    	}
    a++

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2010, 09h50
  2. Réponses: 3
    Dernier message: 16/10/2007, 11h48
  3. pb lors de changement de l'icone de mon application
    Par foufoulina2007 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 04/09/2007, 08h27
  4. [POO] changement nom objet
    Par melou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/10/2005, 08h44
  5. Error in the application, lors du Rendu
    Par MatP dans le forum DirectX
    Réponses: 1
    Dernier message: 26/01/2005, 17h02

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