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

  1. #1
    Membre extrêmement actif 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
    Points : 814
    Points
    814
    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 averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Points : 368
    Points
    368
    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 extrêmement actif 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
    Points : 814
    Points
    814
    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 extrêmement actif 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
    Points : 814
    Points
    814
    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 averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Points : 368
    Points
    368
    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 extrêmement actif 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
    Points : 814
    Points
    814
    Par défaut
    ah oui exact ... autant pour moi
    pour les close j'ai modifé en testant null
    Merci à toi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Petit up du topic car moi itou j'ai un problème de déserialisation de JTree

    le code de la serialisation (from da tuto):

    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
    try
    {
    	// ouverture d'un flux de sortie vers le fichier "FenetrePrincipale.serial"
    	FileOutputStream fos = new FileOutputStream("FenetrePrincipale.serial");
     
    	// création d'un "flux objet" avec le flux fichier
    	ObjectOutputStream oos= new ObjectOutputStream(fos);
    	try
    	{
    		//Récuperation du modèle de la fenetre courante
    		System.out.println(vue.getArboTest().getSelectionPath().getPath());
    		ModeleFenetrePrincipale mfp = vue.viewToModel();
    		System.out.println(mfp.getModeleTreeTest());
     
    		// sérialisation : écriture de l'objet dans le flux de sortie
    		oos.writeObject(mfp);
     
    		// on vide le tampon
    		oos.flush();
    	}
    	finally
    	{
    		//fermeture des flux
    		try
    		{
    			oos.close();
    		}
    		finally
    		{
    			fos.close();
    		}
    	}
    }
    catch(IOException ioe)
    {
    	ioe.printStackTrace();
    }
    }
    le code de la deserialisation (lui aussi pris sur le tuto):

    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
    ModeleFenetrePrincipale newModele = null;
    try
    {
    	// ouverture d'un flux d'entrée depuis le fichier "FenetrePrincipale.serial"
    	FileInputStream fis = new FileInputStream("FenetrePrincipale.serial");
     
    	// 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
    		newModele = (ModeleFenetrePrincipale) ois.readObject();
    	}
    	finally
    	{
    		// on ferme les flux
    		try
    		{
    			ois.close();
    		}
    		finally
    		{
    			fis.close();
    		}
    	}
    }
    catch(IOException ioe)
    {
    	System.out.println("ioe");
    	ioe.printStackTrace();
    }
    catch(ClassNotFoundException cnfe)
    {
    	cnfe.printStackTrace();
    }
    	if (newModele != null)
    	{
    		System.out.println("déserialisation OK");
    		vue = newModele.ModelToView();
    		vue.getArboTest().repaint();
    	}
    }
    Le problème surviens a priori pendant le readObject de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newModele = (ModeleFenetrePrincipale) ois.readObject();
    il me sort un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: path in TreePath must be non null.
    	at javax.swing.tree.TreePath.<init>(TreePath.java:75)
    	at javax.swing.JTree.getPathForIndexs(JTree.java:3118)
    	at javax.swing.JTree.unarchiveExpandedState(JTree.java:3068)
    	at javax.swing.JTree.readObject(JTree.java:3005)
    Pourtant le modèle de mon JTree etend bien DefaultTreeModel et implémente bien Serializable...
    J'ai l'impression que le TreePath qui est null là, c'est le instanceJTree.getSelectionPath().getPath() qui n'est pas sauvegardé lors de la serialisation (maintenant c'est peut être une fausse piste)
    J'avoue que je commence a secher sur ce problème, donc si quielqu'un a une idée

+ 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