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 :

Sérialisation : dépendante de la version de Java ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Par défaut Sérialisation : dépendante de la version de Java ?
    Bonjour à tous !
    Avant d'exposer mon problème, je vous fais une rapide présentation du contexte.

    J'ai repris un projet Java qui a été développé en 2003 et 4 développeurs ont chacun à leur tour travailler dessus. Le projet est assez conséquent, il faut compter une centaine de classes.

    J'ai gardé la dernière version du projet en copie, et j'ai déjà commencé à y apporter des modifications selon les besoins du client.

    L'application permet de créer des schémas à base de JButton, JPanel... et on peut sauvegarder le schéma par la sérialisation dans un fichier au format .alp (ce sont les précédents développeurs qui ont choisi le format).

    Au fur et à mesure que je codais, j'ai remarqué qu'en lançant l'application (celle où j'apportais mes modifications), je n'arrivais pas à ouvrir les anciens schémas créés avant mon arrivé. Je ne pouvait ouvrir que celle que j'ai créé avec cette dernière version de l'application. J'ai alors une exception qui est levée :
    java.lang.ClassCastException: cannot assign instance of javax.swing.ActionMap to field javax.swing.JComponent.ancestorInputMap of type javax.swing.InputMap in instance of javax.swing.JButton

    En effectuant des recherches, j'ai supposé que le problème venait de la sérialisation et que le fait d'avoir apporté des modifications ait rendu l'application incompatible avec les anciens schéma .alp. Cependant j'ai effectué des tests et je ne pense pas que le problème vienne de l'incompatibilité du code mais de la version de Java... Je m'explique : j'ai fait des tests sur plusieurs machines de la boîte, certaines ont Java 6 d'installé et les autres ont Java 8. Lorsque je lance l'application (que ça soit celle de base ou celle que je modifie, j'ai essayé d'alterner les deux sans problème) depuis une machine sous Java 6, je peux ouvrir les anciens fichiers (qui ont été créé par une machine sous Java 6) mais pas les nouveaux (qui ont été créé par une machine sous Java 8). Inversement, lorsque je lance l'application depuis une machine sous Java 8, je ne peux ouvrir que les nouveaux et pas les anciens.

    Ma question est donc : est-ce que la sérialisation est liée à la version de Java ? C'est-à-dire que l'on ne pourrait désérialiser que les fichiers qui ont été sérialisé avec une même version de Java ? Si oui, y-a-t-il une solution pour résoudre ce problème ?

    Excusez-moi pour le pavé, je voulais m'assurer d'être clair (même si je ne sais pas si je l'ai vraiment été ^^").

    Le code étant assez conséquent, j'ai décidé de ne pas tout de suite en montrer et voir si l'on peut répondre à la question sans. Sinon, j'essayerais de mettre les parties de code

    Merci

  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,



    La sérialisation n'est pas directement lié à la version de Java.
    Tu peux très bien sérialisé une classe avec Java 6 et la récupérer sur du Java 8 et inversement... à condition que le code de la classe est le même.



    Si le code de la classe est modifié, il faut que le concepteur de la classe gère cela manuellement en gérant manuellement toutes les différences possibles.
    Et cela peut vite devenir très casse gueule à faire...



    Ton problème c'est que tu sérialises des objets Swing, et que tout ceci n'est pas géré par l'API de Swing.
    La sérialisation de composant Swing n'est viable que pour un stockage temporaire, et uniquement avec la même version de Swing (et donc indirectement de Java).

    C'est indiqué clairement sur la javadoc des composants Swing :
    Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeans™ has been added to the java.beans package. Please see XMLEncoder.


    Comme indiqué, une solution "rapide" consisterait à remplacer la sérialisation par XMLEncoder/XMLDecoder, qui sauvegarde seulement la configuration JavaBeans et non pas la structure interne de l'objet...


    a++

  3. #3
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Par défaut
    Merci beaucoup la réponse a été rapide !

    D'accord tout s'explique, je n'avais pas envisagé que le problème viendrait des composants Swing...

    Je verrais comment mettre en place du coup la sérialisation par XMLEncoder/XMLDecoder

    Merci encore pour la réponse, tu me débloques d'un gros casse-tête

  4. #4
    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 Tehemou Voir le message
    Je verrais comment mettre en place du coup la sérialisation par XMLEncoder/XMLDecoder
    Grosso-modo il suffit de remplacer ObjectOutputStream/ObjectInputStream par XMLEncoder/XMLDecoder...

    Par contre çà sort du XML indenté.
    Du coup il peut être utilise de le coupler avec un GZIPOutputStream/GZIPInputStream pour compresser le tout.



    Tu ne pourras toujours pas lire les "anciens" fichiers au format .alp, mais tu pourrais faire une application Java 6 pour faire la conversion.


    a++

  5. #5
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Par défaut
    D'accord merci pour tes conseils je vais essayer ça tout de suite

  6. #6
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Par défaut
    Resalut

    C'était juste pour dire que j'ai finalement pu résoudre mon problème en utilisant l'API XStream.

    Le problème que j'avais eu avec XMLEncoder/XMLDecoder est que les classes devaient respecter la norme JavaBean et beaucoup de classe ne la respectait pas (pas de constructeur par défaut, la majorité des attributs n'avaient pas de getter/setter...).

    L'utilisation de XStream m'a beaucoup simplifié la chose, car apparemment la norme JavaBean n'avait pas besoin d'être appliquée.

    En tout cas je te remercie encore de ton aide

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

Discussions similaires

  1. Quelle version de java utilisez vous ?
    Par Scorpyosis dans le forum Langage
    Réponses: 115
    Dernier message: 06/11/2006, 20h16
  2. [Débutant] Changer de version de java
    Par sunchai dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 21h52
  3. [Shell]Détecter la version de java dans un script
    Par sc_wizard29 dans le forum Général Java
    Réponses: 4
    Dernier message: 01/07/2005, 10h00
  4. [DOM] Problème entre différentes versions de java
    Par scorpiwolf dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 17/03/2005, 11h40

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