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 :

Sérialisation Objets sauvegarde


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Par défaut Sérialisation Objets sauvegarde
    Bonjour à tous,

    Je débute en java et j'essaye de créer un programme dans le même genre que Paint.
    J'ai suivis le tuto de Christophe Dujardin
    J'ai donc un interface IDrawable qui contient la méthode draw et getRectangle.
    L'interface IMoveDrawable qui en dérive avec la méthode setPosition, j'ai ensuite la classe abstraite FormDrawable qui implemente IMoveDrawable et enfin j'ai la classe ligne...rectangle... cercle qui en dérive et qui définisse la fonction draw.

    J'ai créer 2 fonctions une pour sauver et l'autre pour charger:

    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
    public void SaveFichier()
    {
         ObjectOutputStream oos;
         try {
            	oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("game.txt"))));
     
            	//Nous allons écrire chaque objet dans le fichier
                     for(Iterator it =drawing.iterator(); it.hasNext();)
                     {
                        IMoveDrawing d = (IMoveDrawing) it.next();
                        oos.writeObject(d);
     
                    }
     
     
            	//NE PAS OUBLIER DE FERMER LE FLUX ! ! !
            	oos.close();
        } catch (IOException e) {
                e.printStackTrace();
            }
     
    }
    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
    public void ChargFichier(Chargement fi)
    {
         if(fi.Fichier!=null)
                    {
                         //Nous déclarons nos objets en dehors du bloc try/catch
                    //ObjectInputStream ois;
                         //Création de l'objet File
    		File f = new File(fi.Fichier);
                    ObjectInputStream ois;
    		//On récupère maintenant les données !
            try {
     
                    ois = new ObjectInputStream(new FileInputStream(f));
            	try {
    				System.out.println("Récupération des object:");
    				IMoveDrawing d =((IMoveDrawing)ois).out();
                                    this.addDrawing(d);
                                    /*System.out.println("*************************\n");
                                    System.out.println((ois.readObject()));
    				System.out.println(((Game)ois.readObject()).toString());
    				System.out.println(((Game)ois.readObject()).toString());*/
                                    ois.close();
    			 } 
                    catch (FileNotFoundException ex)
                    {
                         ex.printStackTrace();
                    }
            } catch (IOException ex)
            {
                ex.printStackTrace();
            }     	
     
                    }
     
     
    }
    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
    public abstract class FormDrawing implements IMoveDrawing,Serializable
    {
     
        protected Rectangle rect;
        protected Color color;
        protected double alpha;
     
        public FormDrawing(Color color, Point pos, Dimension dim)
        {
            this.color=color;
            this.rect=new Rectangle(pos,dim);
     
        }
        public abstract void draw(Graphics g, int ep);
     
        public Rectangle getRectangle()
        {
            return (Rectangle) rect.clone();
        }
        public void SetPosition(Point p)
        {
            rect.x=(p.x-rect.width/2);
            rect.y=(p.y-rect.width/2);
        }
        public void SetAlpha(double a)
        {
            alpha=a;
     
        }
        public IMoveDrawing out()
        {
            return (IMoveDrawing)this;
        }
    Voila l'erreur que j'obtient:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.io.ObjectInputStream cannot be cast to paint.IMoveDrawing
    at paint.ZoneDeDessin.ChargFichier(ZoneDeDessin.java:134)
    at paint.MainWindows$OuvrirListener.actionPerformed(MainWindows.java:174)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
    at java.awt.Component.processMouseEvent(Component.java:6267)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6032)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    D’après ce que j'ai compris il y a une erreur de cast mais je vois pas du tout comment je pourrai faire d'autre...
    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMoveDrawing d =((IMoveDrawing)ois).out();
    Ce code à pas beaucoup de sens. Regarder les lignes que vous avez commentées en dessous, c'est comme ça qu'on utilise ObjetctInputStream.

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Par défaut
    Si j'ai bien compris, je dois créer des méthodes qui me renvoient les paramètres de l’objet et ensuite reconstruire cette objet a l'aide de ces paramètres?

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Par défaut
    C'est ce que j'ai fait ça marche nickel! Merci bcp
    Est ce bien la manière propre pour enregistrer un objet?
    Comment fait on pour savoir le nombre d'objet présents dans un fichier?
    (objets de même type)

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non, inutile de faire tout ce travail. Votre problème est là:

    IMoveDrawing d =((IMoveDrawing)ois).out();


    Vous essayez de convertir l'objetinputstream en IMoveDrawing, ce qui n'a pas de sens. Puis vous appelez une obscure méthode out Vous devez lire le premier objet (methode readObject) qui va vous retourner l'objet que vous y aviez sauvé, et, si c'est le bon type, le typecaster pour le mettre dans votre champ:

    coté écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ObjectOutputStream oos = ......;
    IMoveDrawing d = .....;
    oos.writeObject(d);
    coté lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjectInputStream ois = ......;
    IMoveDrawing d = (IMoveDrawing) ois.readObject();

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Par défaut
    merci
    Il ne me reste plus que a déterminer le nombre d'objets que je peux récupérer dans le fichier.
    Existe-t-il une méthode pour faire ça?

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

Discussions similaires

  1. [POO] Sérialiser Objet PHP avec Socket
    Par Invité4 dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2007, 11h37
  2. web.xml, sérialisation objet
    Par ep31 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 26/11/2007, 10h46
  3. Réponses: 13
    Dernier message: 22/06/2007, 19h49
  4. [C#] Sérialisation et sauvegarde de données
    Par scaleo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/07/2006, 11h44
  5. [Architecture / Services] Graphe d'objets à sauvegarder
    Par mauvais_karma dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 5
    Dernier message: 05/03/2006, 16h07

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