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 :

La sérialisation ne marche pas tres bien


Sujet :

Java

  1. #1
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut La sérialisation ne marche pas tres bien
    bonsoir,
    Je vais paraitre prétentieux mais je crois que la sérialisation ne marche pas tres bien dans mon cas, je m'explique:
    Il s'agit d'implémenter un Graphe non orienté (il représente en fait un réseau routier)
    Ce graphe contient donc un ensemble de villes de France et les routes les reliants entre elles.

    la portion de code ou j'ai vu un problème est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (! file.exists() ) creer_Fichier_Graphe();
    charger_Graphe();
    ça veut dire que si le fichier que je voudrais utiliser n'existe pas, on le crée d'abord.
    La création corresponds à la création du Graphe par code en ajoutant des villes et des routes. Ensuite je le sérialise.
    Après la sérialisation du Graphe (qui se trouve à ce moment qu'en mémoire), je le recharge depuis le fichier par la désérialisation.
    et là c'est le drame !
    je vous envoies deux images capturées lors du débogage :
    image 1
    image 2

    la premiere image represente le graphe avant la sérialisation, et vous remarquez que la ville d'Orleans a deux successeurs : Paris et Bourges

    la deuxieme image represente le graphe apres avoir été sérialisé puis désérialisé, et maintenant Orleans n'a que Paris comme successeur mais ou est passé l'autre

    Ce problème a completement foutu l'algorithme de parcours en l'air !

    Dites moi que la sérialisation marche bien et que j'ai tort

    Si quelqu'un veut vérifier par lui même, je peux lui envoyer le projet qui ne contient que quelques fichiers

    merci de votre aide

  2. #2
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Pour comprendre bien mon probleme voici comment je crée le graphe par code avant de le sérialiser:
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    package graphe_app;
     
    import graphe_app.Modele.Caracteristique;
    import graphe_app.Modele.Graphe;
    import graphe_app.Modele.Noeud;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
     
    public class Acces_Fichier {
     
        private String chemin = "villes.serial";
        private Graphe graphe;
     
        // Constructeur
        public Acces_Fichier() {
            File file = new File(chemin);  // c'est pour vérifier si le fichier existe
     
            if (! file.exists()) creer_Fichier_Graphe();//si le fichier n'existe pas,le créer
            graphe = null;
            charger_Graphe();  // charger le graphe à partir du fichier "villes"
        }
     
        // méthode de chargement du graphe à partir du fichier en utili. la désérialisation
        private void charger_Graphe(){
            try {
                // ouverture d'un flux d'entrée depuis le fichier "villes"
                FileInputStream fis =  new FileInputStream(chemin);
     
                // création d'un "flux objet" avec le flux fichier
                ObjectInputStream ois= new ObjectInputStream(fis);
                try {
                  // désérialisation : lecture de l'objet depuis le flux d'entrée
                    graphe = (Graphe) ois.readObject();
                } finally {
                            // on ferme les flux
                            try {  ois.close();  } 
                            finally {     fis.close();       }
                    }
                } 
                catch(IOException ioe) {   ioe.printStackTrace(); } 
                catch(ClassNotFoundException cnfe) {  cnfe.printStackTrace();  }
     
            System.out.println("chargement du Graphe effectué");
     
        }
     
        // méthode de sauvegarde du graphe dans un fichier en utilisant la sérialisation
        private void sauvegarder_Graphe(){
            try {
     
               // ouverture d'un flux de sortie vers le fichier "Domaines.serial"
                FileOutputStream fos = new FileOutputStream(chemin);
                // création d'un "flux objet" avec le flux fichier
                ObjectOutputStream oos= new ObjectOutputStream(fos);
                try {
                    // sérialisation : écriture de l'objet dans le flux de sortie
                    oos.writeObject(graphe);
                    // on vide le tampon
                    oos.flush();
     
                } finally {
                        //fermeture des flux
                            try {
                                oos.close();
                            } finally {  fos.close();   }
                        }
            } catch(IOException ioe) {  ioe.printStackTrace();  }
     
            //System.out.println("sauvegarde du Graphe effectuée");
        }
     
        // création par défaut d'un graphe
        private void initialiser_Graphe(){
            graphe = new Graphe();
     
            // création des villes
            Noeud paris = new Noeud("PAR", "Paris");         paris.setLocation(374, 162);
            Noeud marseille = new Noeud("MAR", "Marseille"); marseille.setLocation(541, 559);
            Noeud nantes = new Noeud("NAN", "Nantes");       nantes.setLocation(192, 289);
            Noeud lille = new Noeud("LIL", "Lille");         lille.setLocation(413, 39);
            Noeud lyon = new Noeud("LYO", "Lyon");           lyon.setLocation(509, 390);
            Noeud troyes = new Noeud("TRO", "Troyes");       troyes.setLocation(470, 205);
            Noeud nancy = new Noeud("NAC", "Nancy");         nancy.setLocation(555, 166);
            Noeud toulouse = new Noeud("TOU", "Toulouse");   toulouse.setLocation(330, 560);
            Noeud amiens = new Noeud("AMI", "Amiens");       amiens.setLocation(372, 84);
            Noeud mans = new Noeud("MAN", "Le Mans");        mans.setLocation(275, 230);
            Noeud reims = new Noeud("REI", "Reims");         reims.setLocation(457, 136);
            Noeud metz = new Noeud("MET", "Metz");           metz.setLocation(555, 138);
            Noeud stras = new Noeud("STR", "Strasbourg");    stras.setLocation(637, 155);
            Noeud montpe = new Noeud("MON", "Montpellier");  montpe.setLocation(440, 553);
            Noeud mulhouse = new Noeud("MUL", "Mulhouse");   mulhouse.setLocation(620, 247);
            Noeud avignon = new Noeud("AVI", "Avignon");     avignon.setLocation(499, 522);
            Noeud rochelle = new Noeud("ROC", "La Rochelle");rochelle.setLocation(210, 349);
            Noeud orleans = new Noeud("ORL", "Orleans");     orleans.setLocation(345, 236);
            Noeud bourges = new Noeud("BOU", "Bourges");     bourges.setLocation(373, 288);
            Noeud chateau = new Noeud("CHA", "Chateauroux"); chateau.setLocation(347, 325);
            Noeud limoges = new Noeud("LIM", "Limoges");     limoges.setLocation(328, 364);
            Noeud bordeaux = new Noeud("BOR", "Bordeaux");   bordeaux.setLocation(224, 428);
     
            graphe.ajouterNoeud(paris);        graphe.ajouterNoeud(marseille);
            graphe.ajouterNoeud(nantes);       graphe.ajouterNoeud(lille);
            graphe.ajouterNoeud(lyon);        graphe.ajouterNoeud(troyes);
            graphe.ajouterNoeud(nancy);       graphe.ajouterNoeud(toulouse);
            graphe.ajouterNoeud(amiens);        graphe.ajouterNoeud(mans);
            graphe.ajouterNoeud(reims);        graphe.ajouterNoeud(metz);
            graphe.ajouterNoeud(stras);        graphe.ajouterNoeud(montpe);
            graphe.ajouterNoeud(mulhouse);        graphe.ajouterNoeud(avignon);
            graphe.ajouterNoeud(rochelle);        graphe.ajouterNoeud(orleans);
            graphe.ajouterNoeud(bourges);        graphe.ajouterNoeud(chateau);
            graphe.ajouterNoeud(limoges);        graphe.ajouterNoeud(bordeaux);
     
            // création des routes
            graphe.ajouterArete(paris, troyes, new Caracteristique(200, 100)); 
     
            graphe.ajouterArete(paris, amiens, new Caracteristique(180, 90)); 
     
            graphe.ajouterArete(paris, mans,new Caracteristique(230, 90));
     
            graphe.ajouterArete(paris, orleans,new Caracteristique(140, 90));
     
            graphe.ajouterArete(mans, nantes,new Caracteristique(250, 90));
     
            graphe.ajouterArete(lille, amiens, new Caracteristique(150, 90));
     
            graphe.ajouterArete(troyes, nancy, new Caracteristique(170, 90));
     
            graphe.ajouterArete(troyes, lyon,new Caracteristique(750, 90));
     
            graphe.ajouterArete(marseille, lyon,new Caracteristique(600, 90));
     
            graphe.ajouterArete(marseille, avignon,new Caracteristique(100, 90));
     
            graphe.ajouterArete(montpe, avignon,new Caracteristique(130, 90));
     
            graphe.ajouterArete(montpe, toulouse,new Caracteristique(220, 90));
     
            graphe.ajouterArete(paris, reims,new Caracteristique(170, 90));
     
            graphe.ajouterArete(reims, metz, new Caracteristique(160, 90));
     
            graphe.ajouterArete(metz, stras, new Caracteristique(120, 90));
     
            graphe.ajouterArete(nancy, stras, new Caracteristique(125, 90));
     
            graphe.ajouterArete(troyes, mulhouse, new Caracteristique(300, 90));
     
            graphe.ajouterArete(mulhouse, stras,new Caracteristique(220, 90));
     
            graphe.ajouterArete(nantes, rochelle,new Caracteristique(170, 90));
     
            graphe.ajouterArete(nantes, rochelle,new Caracteristique(150, 90));
     
            graphe.ajouterArete(rochelle, bordeaux,new Caracteristique(190, 90));
     
            graphe.ajouterArete(bordeaux, toulouse,new Caracteristique(320, 90));
     
            graphe.ajouterArete(orleans, bourges,new Caracteristique(110, 90));
     
            graphe.ajouterArete(chateau, bourges, new Caracteristique(80, 90));
     
            graphe.ajouterArete(chateau, limoges,new Caracteristique(70, 90));
     
            graphe.ajouterArete(limoges, toulouse, new Caracteristique(500, 90));
     
        }
     
        private void creer_Fichier_Graphe() {
            initialiser_Graphe();
            sauvegarder_Graphe();
     
            System.out.println("Création du graphe réussie");
        }
     
        public Graphe getGraphe() {
            return graphe;
        }
     
    }
    J'ai découvert aussi qu'un deuxieme noeud voit un de ses successeurs disparaitre. Pourtant, comme vous pouvez le remarquer la création des villes est la même pour toutes, et il n y a aucun code susceptible de modifier le graphe apres sa création dans la méthode initialiser_Graphe().

  3. #3
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Mauvaise nouvelle : la sérialisation marche très bien, donc c'est toi qui t'est gouré quelque part !

    Plutot que de nous envoyer l'ensemble de ton code (à moins que quelqu'un veuille s'y pencher ? ), pourrais-tu reproduire ton problème sur 2-3 villes avec un graphe simplifié au maximum ?

  4. #4
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Mauvaise nouvelle : la sérialisation marche très bien, donc c'est toi qui t'est gouré quelque part !

    Plutot que de nous envoyer l'ensemble de ton code (à moins que quelqu'un veuille s'y pencher ? ), pourrais-tu reproduire ton problème sur 2-3 villes avec un graphe simplifié au maximum ?
    Merci de ta réponse,
    juste pour info, quand j'utilise le graphe nouvellement crée par code sans le recharger depuis un fichier, tout marche nickel !
    je vais faire quelques test pour voir ...

  5. #5
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Il semblerait que le hashCode de Ville et/ou Route soit en cause, mais pourquoi , quand je n'utilise pas la sérialisation ça marche normalement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Ville implements Serializable {
     
        private String code;
        private String nom;
        private Set<Ville> sucesseurs; // liste des successeurs de cette ville
        private Point location;// coordonnées qui permet. de déssiner la ville sur la carte
    ....
    @Override
        public int hashCode() {
            int hash ;
            hash = (this.nom != null ? this.nom.hashCode() : 0);
            return hash;
        }
    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
    public class Route implements Serializable {
     
        private Ville premiereVille;
     
        private Ville deuxiemeVille;
     
        private Caracteristique carac;  // distance et vitesse
    ....
     
    @Override
        public int hashCode() {
            int hash = 7;
            hash = premiereVille.hashCode() + deuxiemeVille.hashCode(); 
            return hash;
        }
    j'ai changé le hashCode généré par NetBeans mais sans succès.
    pensez vous qu'il pourrait y avoir un débordement avec les valeurs d'un int et du coup le résultat sera faussé.

  6. #6
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    En l'état je ne vois pas dans ces hashcodes ce qui pourrait clocher. Simplement je ne les trouve pas très standards, mais comme, jusqu'à présent , personne n'a réussi à m'expliquer pourquoi le standard était mieux que la débrouille en ce domaine...

    Que t'apporte la redéfinition de ces hashcodes ?... Qu'est-ce qui te pousse à mettre ces hashcodes en cause ?

  7. #7
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    En l'état je ne vois pas dans ces hashcodes ce qui pourrait clocher. Simplement je ne les trouve pas très standards, mais comme, jusqu'à présent , personne n'a réussi à m'expliquer pourquoi le standard était mieux que la débrouille en ce domaine...

    Que t'apporte la redéfinition de ces hashcodes ?... Qu'est-ce qui te pousse à mettre ces hashcodes en cause ?
    parceque quand je change ce hashCode par differentes combinaisons, à chaque fois (ou presque) le plus court chemin change (et il est faux) sauf quand je ne sérialise/deserialise pas

  8. #8
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Pour être sur de générer des hashCode corrects, j'ai défini un champ privé num pour Ville et un autre pour Route, et qui s'incrémentent à chaque fois qu'on ajoute une ville ou une route.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public hashCode(){
        return num;
    }
    et le problème a disparu !

    conclusion: de préférence ne pas utiliser les String pour générer le hashCode, et ne pas se reposer aveuglément sur la génération automatique par un EDI.

    Mais pourquoi la sérialisation ne s'est pas bien passé dans ce cas ,MYSTERE

    voilà fin de l'histoire

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/09/2008, 13h00
  2. requete qui ne fonctionne pas tres bien!
    Par touille dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/07/2008, 12h10
  3. Réponses: 2
    Dernier message: 22/09/2007, 11h39
  4. [RegEx] [bbcode] marche pas bien avec associations
    Par Woufeigh dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2007, 20h32

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