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

Composants Java Discussion :

[JTree] Problème de Serialisation / Deserialisation


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut [JTree] Problème de Serialisation / Deserialisation
    bonjour à tous,
    j'ai un petit problème pour la déserialisation de mon JTree...
    Voici comment je procède :

    SERIALISATION
    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
     
    			JFileChooser chooser = new JFileChooser();
    			// on recupere le choix de l'utilisateur: OUVRIR/ANNULER
    			int returnVal = chooser.showSaveDialog(null);
     
    			// si le choix est OUVRIR on parcours le fichier
    			if (returnVal == JFileChooser.APPROVE_OPTION) {
    				//on recupere le chemin absolu du fichier
    				String chemin = chooser.getSelectedFile().getAbsolutePath();
     
     
    				if ( (!chooser.getSelectedFile().exists()) || 
    						(JOptionPane.showConfirmDialog(
    								null,
    								"File already exist, override?",
    								"override?",
    								JOptionPane.YES_NO_OPTION
    						) == JOptionPane.YES_OPTION) ){
     
    					// on ajoute '.c' si besoin est
    					if (!chemin.endsWith(".str"))
    						chemin +=".str";
     
    					// ouverture d'un flux de sortie vers le fichier "personne.serial"
    					FileOutputStream fos = null;
    					ObjectOutputStream oos =null;
    					try {
    						fos = new FileOutputStream(chemin);
    						oos = new ObjectOutputStream(fos);
     
    						// sérialisation : écriture de l'objet dans le flux de sortie
    						oos.writeObject(arbre.getModel()); 
    						// on vide le tampon
    						oos.flush();
    						System.out.println("arbre  a ete serialise");
     
    					} catch (FileNotFoundException e) {
    						e.printStackTrace();
    					}catch (IOException e) {
    						e.printStackTrace();
    					} finally{
    						//fermeture des flux
    						try {
    							oos.close();
    							fos.close();
    						} catch (IOException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    					}
    				}//fin de si
    			}//fin de si

    DESERIALISATION
    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
     
                            JFileChooser chooser = new JFileChooser();
    			// on recupere le choix de l'utilisateur: OUVRIR/ANNULER
    			int returnVal = chooser.showOpenDialog(null);
     
    			// si le choix est OUVRIR on parcours le fichier
    			if (returnVal == JFileChooser.APPROVE_OPTION) {
    				//on recupere le chemin absolu du fichier
    				String chemin = chooser.getSelectedFile().getAbsolutePath();
     
     
    				if ( chemin != null && !"".equals(chemin)){
     
    					try {
    						// ouverture d'un flux d'entrée depuis le fichier "personne.serial"
    						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
    							arbre.setModel((TreeModel) ois.readObject()); 
    							panelArbre.setViewportView(arbre);
    						} finally {
    							// on ferme les flux
    							try {
    								ois.close();
    							} finally {
    								fis.close();
    							}
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					} catch(ClassNotFoundException cnfe) {
    						cnfe.printStackTrace();
    					}
    				}//fin de si
    			}//fin de si
    A priori c'est correct non ? Je repris le code du site sur la serialisation

    L'ERREUR:
    J'ai un renderer personnalisé et des noeud qui contiennent des objets personnalisés aussi.... ce qui donne : MyTreeRenderer, MyCustomNode, et MyTreeObject dans l ordre...
    et quand je charge le modèle MyTreeRenderer lance une exception car les objets sont null apparement

    Est-ce un problème de Serialisation ou bien est-ce à cause de mes noeuds(et objets ) perso ??

    merci d avance

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Il faut que les classes que tu sérialises implémentent l'interface Serializable. Et elles doivent si les objets contenus ne sont pas Serializable "par défaut" (ie String, int, ...), tu dois créer les deux méthodes de sérialisation.

    PS: Attention à la gestion de tes try/catch. Tu peux avoir des null pointer exception avec ton implémentation.

  3. #3
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    Voici les objets contenus dans les noeuds de mon arbre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MyTreeObject{
     
    	private String nom = null;
    	private String valeur = null;
     
    	public MyTreeObject(String nom, String valeur){
    		this.nom = nom;
    		this.valeur = valeur;
    	}
    }
    comment écrire les 2 méthodes en questions ?

    PS: Attention à la gestion de tes try/catch. Tu peux avoir des null pointer exception avec ton implémentation.
    J'ai pris l exemple du site, je pensais qu'il était bon

  4. #4
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    bon c'est bon j'ai trouvé ça marche nikel

    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
     
     
    private void writeObject(ObjectOutputStream out) throws IOException {
    		// appel des mécanismes de sérialisation par défaut
    		out.defaultWriteObject();
     
    		// on sérialise les attributs normalement non sérialisés
    		out.writeUTF(nom); 
    		out.writeUTF(valeur); 
    	}
     
    	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    		// appel des mécanismes de désérialisation par défaut
    		in.defaultReadObject();
     
    		// on désérialise les attributs normalement non désérialisés
    		nom = in.readUTF(); 
    		valeur = in.readUTF(); 
    	}
    nom et valeur étant des String.

    si ça peut servir à quelqu'un ...

    merci en tous cas

  5. #5
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Ce que tu as fait est inutile. Il aurait fallut simplement ajouter implements Serializable et ça aurait du marcher. On implémente les méthodes spéciales uniquement si les objets contenus dans la classe ne sont pas Serializable.*

    Pour le try/catch rien ne dit que tes objets ne sont pas nuls quand tu essaies de les fermer.

  6. #6
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    ah oui exact ... autant pour moi
    pour les close j'ai modifé en testant null
    Merci à toi

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

Discussions similaires

  1. Problème de serialisation/deserialisation
    Par NoiBe dans le forum Services Web
    Réponses: 0
    Dernier message: 18/03/2009, 18h40
  2. [Serialisation]Serialisation / Deserialisation.
    Par neXistPa dans le forum Général Java
    Réponses: 6
    Dernier message: 29/11/2005, 07h52
  3. [Info]Sérialisation / Désérialisation...
    Par onlytoine dans le forum Général Java
    Réponses: 3
    Dernier message: 27/08/2005, 21h58
  4. [JTree] Problème d'ouverture de chemin dans un JTree
    Par antares24 dans le forum Composants
    Réponses: 2
    Dernier message: 11/03/2005, 08h18
  5. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 14h06

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