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 :

sauvegarder et charger des objets en java


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut sauvegarder et charger des objets en java
    Bonjour, j'espère poster dans le bon forum cette fois-ci,
    je vous explique mon problème:

    je possède une classe (la fenêtre principale de mon application) qui contient en mémoire un tableau de 32 cases pouvant chacune contenir un objet dérivé du type JPanel (qui contient d'autre JPanel ainsi que plein de boutons, de JTextFiel et d'autres trucs).

    Je voudrais pouvoir sauvegarder le tableau d'objets (ou les objets qu'il contient) dans un fichier (.txt, .ser ou autre) pour pouvoir restaurer ce tableau (ou les objets) lors d'une prochaine réouverture du programme.

    J'ai trouver pas mal de récit sur la sérialisation ou l'externalisation mais rien qui ne se rapporte à mon cas de figure.

    mon code a la forme suivante pour la sauvegarde:

    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
     
     
    private void sauver_objetsActionPerformed(ActionEvent evt) {
    		try{
    			FileOutputStream l_fos = new FileOutputStream("sauvegarde.ser");
    			ObjectOutputStream l_oos = new ObjectOutputStream (l_fos);
    			l_oos.write(this.compteur_objets);//une variable globale qui compte le nombre d'objets présents dans le tableau d'objets
    			for(indice_tab=0;indice_tab<32;indice_tab++){
    				if(tableau_postes[indice_tab]!=null){
    						l_oos.writeObject(tableau_postes[indice_tab]);
     
    				}
    				else{}
    			}
    			l_oos.flush();
    			l_oos.close();
    		}catch(java.io.IOException er){er.printStackTrace();}
    	}
    et la forme suivante pour le chargement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void charger_objetsActionPerformed(ActionEvent evt) {
    		try{
    			FileInputStream l_fis = new FileInputStream("sauvegarde.ser");
    			ObjectInputStream l_ois = new ObjectInputStream(l_fis);	
    			int nb_objets = (int) l_ois.read();
    			MonObjet data_objets = (MonObjet) l_ois.readObject();
    			for(indice_tab=0;indice_tab<nb_objets;indice_tab++){
                                     tableau_Objets[indice_tab]=(MonObjet) data_objets;
                             }
    		}
    		catch(java.io.IOException err)		{jTextArea1.append("\n     erreur chargement\n\n");}
    		catch (ClassNotFoundException e) 	{jTextArea1.append("\n     fichier non trouve\n\n");}
    	}

    évidemment le programme n'apprécie pas les commandes, mais je ne vois pas du tout comment faire mon affaire.

    Merci en tout cas de pouvoir m'éclairer.

    free-lance

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, quelles sont les erreurs? est-ce que ta classe MonObjet implémente l'interface Serializable?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    oui oui, "MonObjet" implements Serializable.

    Les erreurs sont que le programme semble rester à tourner sur la sauvegarde du 1er objet du tableau.

    Ce qui est bizard, c'est que si je tente de réouvrir le fichier de sauvegarde, je vois bien apparaître le "nb_objets" que je voulais sauvegarder.
    De même, si j'ouvre un éditeur, je retrouve bien le nom du 1er objet du tableau qui a été sauvegarder, seulement, tout ça se limite au 1er objet... rien concernant les autres (qu'ils existent ou qu'ils soient "null").

    Résultat, mon programme tourne en boucle sur la sauvegarde et j'ai une erreur au chargement... bref la misère quoi.

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Le truc que je trouve génant dans ton code c'est que tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(indice_tab=0;indice_tab<32;indice_tab++){
    Alors que je verrais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(indice_tab=0;indice_tab<tableau_postes.length;indice_tab++){
    Mais je ne suis pas expert en sérialisation, il y a peut-être autre chose qui ne va pas.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    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
     
    	private void sauver_postesActionPerformed(ActionEvent evt) {
    		try{
    			FileOutputStream l_fos = new FileOutputStream("sauvegarde.ser");
    			ObjectOutputStream l_oos = new ObjectOutputStream (l_fos);
    			l_oos.writeObject(tableau_objets[0]);
    			l_oos.flush();
    			l_oos.close();
    		}catch(java.io.IOException er){er.printStackTrace();}
    	}
     
     
     
    	private void charger_postesActionPerformed(ActionEvent evt) {
    		try{
    			FileInputStream l_fis = new FileInputStream("sauvegarde.ser");
    			ObjectInputStream l_ois = new ObjectInputStream(l_fis);	
    			tableau_objets[] data_objet=(tableau_objets[]) l_ois.readObject();
     
    			tableau_objets[0]=data_objet[0];
    		}
    		catch(java.io.IOException err)		{jTextArea1.append("\n     erreur chargement\n\n");}
    		catch (ClassNotFoundException e) 	{jTextArea1.append("\n     fichier non trouve\n\n");}
    	}

    Pour simplifier le tout j'ai tenté de ne sauvegarder et de ne recharger QUE le 1er objet du tableau d'objets (objet non "null" donc)...
    Le résultat est toujours le même, à savoir que je reste dans la sauvegarde de l'objet et que le "load" de l'aobjet me donne une erreur de chargement.

  6. #6
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Je te conseil de mettre des balises dans ton code pour voir où tu passe exactement, cela te permettra de voir où tu tourne en boucle à un moment donné. Tu peux par exemple utiliser le log4j (tuto ici)

    non le System.out.println("toto") est mal =>

    regarde aussi si tes variables de ton tableau sont bien présente dans le tableau avant, ou si tu essaierai pas de sérialisé un objet non sérialisable par exemple. Je ne susi aps expoert mais on sait jamais.

  7. #7
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Utilise un debugger, t'iras plus vite.

    Quelle tête il a MonObjet ?

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    j'avais foutu des affichages un peu partout c'est pour ça que j'ai vu que ça tournait sans cesse dans le "writeObject()". J'ai tout retiré pour simplifier la visualisation.
    Sinon avant la sauvegarde les objets ont tout ce qu'il faut où il faut (à commencer par le "name").

    Un objet type "MonObjet" est constitué de 15 attributs.
    Chacun de ces attributs est un JPanel qui contient plein de boutons, de JTextField et autre JComboBox... bref des sortes de mini appli quoi.

    Voilà pour les réjouissances héhéhé

  9. #9
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    A tous les coups t'as une boucle (un composant qui en réfère un autre qui réfère le premier). Ton fichier doit grossir indéfiniment ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 432
    Points
    432
    Par défaut
    Je dirais qu'il y a sûrement un problème de conception dans ton application , cela me parait étrange de vouloir sauvegarder des JPanels. En gros tu essais de sauvegarder une interface complète avec des boutons , champs de saisies ect ... . Je pense que c'est une très mauvaise approche.

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Mon fichier .SER fait toujours 26ko, il semble ne sauvegarder "que" le premier objet de mon tableau.
    Autre solution si la sauvegarde des JPanel est trop compliquée, c'est répertorier les champs qui m'intéressent, reconstituer le JPanel, et réintroduire les valeur des champs sauvegardés... ça pourrait marcher ça d'après vous ?

  12. #12
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Comme le dit Elendhil c'est la voie. En fait ton appli ne doit sauvegarder que le contexte métier et pas les composants ihm.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Ok donc pour résumer j'ai plus intérêt à sauvegarder uniquement les champs qui m'intéressent... c'est ça ?

  14. #14
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Oui.

  15. #15
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    pourquoi tu ne formatte pas ton interface en un fichier XML et tu ne sauvegarde que les donnees que tu en as besoin?

  16. #16
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Ok bon alors j'arrive à sauvegarder le nombre d'objets que j'ai ainsi que les noms des objets, cependant, je ne réussis à récupérer que le int (le nombre d'objets) mais pas les noms.

    Dans la fonction de sauvegarde je "write" 1 "int" et je fais une boucle pour "write" les nom des objets.
    Quand j'ouvre mon fichier .SER je vous bien ma valeur ainsi que les nom.

    Pour le chargement ça pose pb au moment de la boucle où je veux charger les noms dans les objets... là je ne vois pas par contre.

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    Suite de mes aventures de sauvegarde:

    j'ai finalement réussi à sauvegarder et restaurer le nombre d'objets ainsi que les noms des différents objets, cependant il me reste à savoir s'il est possible de sauvegarder un JPanel avec tout ce qu'il contient et non plus un objet entier qui contient des JPanel (la différence n'est pas immense mais bon...).

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Points : 20
    Points
    20
    Par défaut
    bon je viens de mettre en place le coup de la sauvegarde "champs-par-champs"... ça devient très vite fastidieux mais ça marche...
    je verrai selon le temps qu'il me reste si je me lance dans la procédure des fichiers XML ou non.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2011, 17h52
  2. Affichage d'un niage des objet en java 3d
    Par elmoul7ak dans le forum 3D
    Réponses: 5
    Dernier message: 19/08/2008, 00h32
  3. Comment charger des objets dans un accde
    Par alain91210 dans le forum Modélisation
    Réponses: 1
    Dernier message: 19/12/2007, 21h50
  4. Créer des objets avec Java Monkey Engine
    Par ToTo13 dans le forum 3D
    Réponses: 3
    Dernier message: 31/07/2007, 15h06
  5. taille des objets en java
    Par tarik1099 dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2007, 20h59

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