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

Entrée/Sortie Java Discussion :

sérialisation portable ?


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut sérialisation portable ?
    Bonjour,

    J'ai une application où je sérialise un objet pour le stocker en fichier.
    La sérialisation et déserialisation se passe très bien sur ma machine sous Windows.
    En revanche, mon collègue sous Mac peut sérialiser sans exception et ça lui créer bien un fichier, par contre impossible de le désérialiser, affichage du message "invalid/corrupt".
    Et si je lui donne un fichier où j'ai sérialisé un objet, il ne peut pas le lire, ça lui affiche la même chose....

    C'est étrange, avez-vous une idée là-dessus ?
    Merci d'avance pour votre aide.
    Marc

  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,


    Sans code ni message d'erreur complet cela va être difficile de t'aider...


    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Bonjour adiGuba,

    Okay pour le code, je vais en mettre ci-dessous mais je ne peux pas tout mettre, trop de code.
    Mais il n'y a rien d'extraordinaire, je pense, dans le code ci-dessous....

    Ouverture du fichier (déserialisation)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
    	ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
    	GuiLTS glts = (GuiLTS) in.readObject();
    	DrawingPanel fap = new DrawingPanel(glts, this);
    	this.jTabbedPaneMain.add(fap.getGuiLTS().getName(), fap);
    	in.close();
    } catch (Exception ex) {
    	JOptionPane.showMessageDialog(this,
    			"File is corrupt/invalid.",
    			"Error",
    			JOptionPane.ERROR_MESSAGE);
    }
    Sauvegarde en fichier (sérialisation)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try {
    	ObjectOutput out = new ObjectOutputStream(new FileOutputStream(file));
    	out.writeObject(aFap.getGuiLTS());
    	out.flush();
    	out.close();
    } catch (IOException ex) {
    	JOptionPane.showMessageDialog(this, ex.getMessage(), "Error",
    			JOptionPane.ERROR_MESSAGE);
    }
    Sur ma plateforme Windows, ça fonctionne pour les 2.
    En fait mon collègue (sous Mac) vient de voir que ça ne va pas dès la sérialisation dans un cas bien précis car il a une erreur avec le message suivant: java.awt.geom.Rectangle2D$Float

    J'ai demandé à un autre collègue qui vient de rentrer de tester sous Linux pour voir le résultat.

    Est-ce que ça pourrait provenir de la version de la JVM ?

    Merci d'avance pour votre aide.
    Marc

  4. #4
    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
    Déjà modifie ton bloc catch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    } catch (Exception ex) {
    	JOptionPane.showMessageDialog(this,
    			"File is corrupt/invalid.",
    			"Error",
    			JOptionPane.ERROR_MESSAGE);
    }
    Cela n'apporte aucune aide et le message "File is corrupt/invalid." est tout sauf utile !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    } catch (Exception ex) {
            ex.printStackTrace();
    	JOptionPane.showMessageDialog(this,
    			"File is corrupt/invalid.",
    			"Error",
    			JOptionPane.ERROR_MESSAGE);
    }
    En rajoutant un printStackTrace() tu auras plus de détail sur l'origine du problème...


    Et même chose en ce qui concerne le catch de la sérialisation. Le getMessage() n'est pas suffisamment explicite pour apporter une aide utile...


    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Re,

    En effet, en plus du message utilisateur, j'ai ajouté un printstacktrace.
    J'ai demandé à un autre collègue de tester sur sa machine (linux) et ça fonctionne très bien !
    On arrive même à relire les fichiers entre nos 2 plateformes (Windows et Linux), en fait le problème ne se produit que sous Mac....
    Bizarre, non ?

    Merci d'avance pour votre aide.

    Marc

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Je ne vois pas de fermture de flux dans un bloc "finally"...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Bonjour,
    Okay je viens d'ajouter la fermeture du flux dans un bloc finally.
    Sinon, après avoir ajouter le printstacktrace dans le bloc catch, mon collègue obtient la trace ci-après.
    Avez-vous une idée ?
    Merci d'avance pour votre aide.
    Marc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    java.io.NotSerializableException: java.awt.geom.Rectangle2D$Float
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
        at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1251)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
        at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:391)
        at java.util.Vector.writeObject(Vector.java:1018)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
        at fr.emn.stslib.gui.FrameMain.saveOnDisk(FrameMain.java:656)
        at fr.emn.stslib.gui.FrameMain.saveOrExport(FrameMain.java:797)
        at fr.emn.stslib.gui.FrameMain.jMenuItemSaveActionPerformed(FrameMain.java:959)
        at fr.emn.stslib.gui.FMjMenuItemSaveActionAdapter.actionPerformed(FrameMain.java:1527)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2202)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:334)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1051)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1092)
        at java.awt.Component.processMouseEvent(Component.java:5583)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
        at java.awt.Component.processEvent(Component.java:5348)
        at java.awt.Container.processEvent(Container.java:2010)
        at java.awt.Component.dispatchEventImpl(Component.java:4050)
        at java.awt.Container.dispatchEventImpl(Container.java:2068)
        at java.awt.Component.dispatchEvent(Component.java:3885)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4256)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3936)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3866)
        at java.awt.Container.dispatchEventImpl(Container.java:2054)
        at java.awt.Window.dispatchEventImpl(Window.java:1791)
        at java.awt.Component.dispatchEvent(Component.java:3885)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Salut,

    Et ça fonctionne sur les autres machines ?! Sans erreur ? parce que bon l'erreur est assez explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.NotSerializableException: java.awt.geom.Rectangle2D$Float
    Tu sembles essayer de sérialiser un objet de type Rectangle2D.Float alors que celui-ci n'implémente pas l'interface Serializable, ça semble donc assez difficile ...

  9. #9
    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
    Citation Envoyé par Napalm51 Voir le message
    Tu sembles essayer de sérialiser un objet de type Rectangle2D.Float alors que celui-ci n'implémente pas l'interface Serializable, ça semble donc assez difficile ...
    D'après la javadoc Rectangle2D.Float n'est Serializable que depuis Java 6, et ne l'es donc pas avec Java 5 ou inférieur...


    Vérifie donc ta version de Java... mais il me semble que Java 6 n'est pas encore disponible sous Mac...


    a++

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    En effet ... ma méthode "taper le nom de la classe dans la barre d'adresse et attendre que la chance de Google soit avec moi" me renvoi toujours vers la JavaDoc 1.4 :/ source d'erreur ^^

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Bonsoir,
    Oui, Napalm51, ça fonctionne bien sur les 2 autres machines (Linux et Windows).
    Effectivement, adiGuba, je pense que tu as trouvé le problème, j'étais déjà tombé sur un cas similaire avec l'api desktop qui n'était pas implémenté que sous Java 6 et non sorti sous Mac mais là je n'avais pas fait le rapprochement.
    Elle est sortit mais seulement en beta.
    Je ne sais pas quand vont-ils se décider à la porter !? C'est quand même fou ces différences de temps dans les sorties...
    Merci à vous deux pour vous être penché sur mon problème.
    Bonne continuation.

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

Discussions similaires

  1. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18
  2. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  3. Code Portable
    Par D[r]eadLock dans le forum C
    Réponses: 9
    Dernier message: 14/09/2002, 13h44
  4. [Migratation] Application portable, indépendant du SGDB
    Par benouille dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 28/08/2002, 13h51
  5. Choix d'un EDI pour la 3D (Open GL, Portable)
    Par Riko dans le forum OpenGL
    Réponses: 6
    Dernier message: 01/08/2002, 12h25

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