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

Java Discussion :

[Serialisation] Modification/Evolution de l'objet serializable.


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut [Serialisation] Modification/Evolution de l'objet serializable.
    Bonjour,

    Je me pose des questions sur une situation car je vais y faire face d'ici peu, je m'explique.

    Mon programme réalise des sauvegardes à l'aide de la sérialisation binaire. Mais évidemment lorsque je modifie l'objet concerné, que je l'améliore, l'ouverture des anciennes sauvegardes ne fonctionne plus.

    Alors comment géré cela, et faire en sorte que l'utilisateur puisse ouvrir des anciennes versions de fichier, 2 ou 3 versions antérieurs par exemple?

    Mais aussi pour gérer le fait que les nouvelles méthodes de l'objet ne fonctionnent pas sur les anciennes versions?

    J'ai bien quelques petites idées, mais qui ne me paraissent pas très propre.

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Par défaut
    Bonjour,

    Il faudrait garder toutes les versions correspondantes de ta classe avec les fichiers binaires.
    Donc créer une nouvelle classe à chaque modification, et coder un moyen de reconnaitre la classe correspondante au binaire.

    Peut être que ca existe déjà, autant ne pas réinventer la roue, mais je trouve pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut
    J'ai trouvé : Le serial version UID est fait pour ca!

  4. #4
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Par défaut
    Ah ben nickel,

    Tu pourrais nous exposer rapidement comment ca se passe?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut
    Alors, de ce que j'ai compris grâce à la partie versioning de cette page notamment :

    http://java.sun.com/developer/techni...serialization/

    Il est possible pour les classes implementants serialisable, de créer un attribut static correspondant à un identifiant, c'est le serial version UID :

    private static final long serialVersionUID = 4672745540982379891L;


    C'est cette identifiant, sérialisé lui aussi, qui va permettre à la JVM de faire la connexion avec la classe correspondante même si celle ci a été modifié.


    Si l'on ne fixe pas nous même cette ID, celui ci est créé automatiquement lors de la création de la classe SAUF qu'il est modifié a chaque modification de la classe (ajout/retrait d'attributs, ajout/retrait de méthodes). C'est cette modification qui empêche l'ouverture d'un ancien fichier!


    Je n'ai pas encore testé en profondeur, je ne peux donc pas parler du comportement d'un objet face aux méthodes qui n'existait pas lors de sa sérialisation..


    Voila, dites moi si j'ai fait des erreurs et surtout n'hésitez pas à rajouter des infos sur le serialversionUID.

  6. #6
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Par défaut
    Ok merci des précisions.

    Perso, Eclipse me met un warning si je ne génère pas cet UID.
    Je sais qu'il servais à la sérialisation, mais je pensais plutôt que c'était pour les objets qui transitaient entre 2 programmes (client / serveur ...)

    Du coup, t'es obligé de garder une historique de ta classe en question?

  7. #7
    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
    Citation Envoyé par JuFromParis Voir le message
    Je n'ai pas encore testé en profondeur, je ne peux donc pas parler du comportement d'un objet face aux méthodes qui n'existait pas lors de sa sérialisation..
    Les méthodes ne sont pas sérialisées, donc cela n'a aucune influence là dessus.
    L'objet que tu recevras correspondra à la version de la classe que tu as chargé en mémoire.



    Pour ce qui est des champs, en cas d'absence ils prendront la valeur nulle (même si tu les initialises à la déclaration).

    Tu peux pallier à cela en définissant une méthode readResolve() qui vérifierait la valeur des champs ajoutés. Cette méthode est appelée à la fin du processus de sérialisation.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	private Object readResolve() throws ObjectStreamException {
    		if (this.monAttrib == null) {
    			this.monAttrib = "valeur par defaut";
    		}
    		return this;
    	}

    a++

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

Discussions similaires

  1. comment récupérer un int d'un objet Serializable ?
    Par blueLight dans le forum Général Java
    Réponses: 4
    Dernier message: 06/06/2009, 09h58
  2. Réponses: 7
    Dernier message: 14/05/2009, 23h01
  3. serialisation d'une liste d'objets
    Par Spidermeu dans le forum C#
    Réponses: 9
    Dernier message: 08/09/2008, 11h11
  4. Serialisation d'une liste d'objets
    Par E@gle_One dans le forum Langage
    Réponses: 3
    Dernier message: 07/01/2008, 18h14
  5. Envoi d'objet serializable entre client serveur
    Par the_frette dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/12/2007, 10h23

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