Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2874 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Problème de sérialisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de sérialisation

n°1171379
Phendrill
Posté le 06-08-2005 à 20:36:55  profilanswer
 

Bonjour,
 
Je m'initie au JAVA depuis peu et je rencontre un problème avec la sérialisation.
Je cherche à stocker dans un même fichier des objets d'un même type. Ca ca marche.
Par contre je n'arrive pas à les relire correctement, une exception StreamCorruptedException
est levée. J'arrive bien à lire la première occcurence dans le fichier, c'est la seconde qui
génère l'exception.
 
Sur Internet, je n'ai pas réussi à trouver un exemple de boucle de lecture d'objets dans un fichier
alors j'espère avoir plus de chance ici.
 
Le code qui enregistre un objet sérialisé (la classe s'appelle Portefeuille):
 
    public void enregistrerPortefeuille()
    {
        try
        {
            FileOutputStream fic = new FileOutputStream(fichier,true);
            ObjectOutputStream fic2 = new ObjectOutputStream(fic);
            fic2.writeObject(this);
            fic2.close();
        }
        catch(IOException err)
        {
            err.getMessage();
            err.printStackTrace();
        }
    }
 
Elle ne pose pas de problème. Voilà la méthode (posant problème) qui lit les portefeuilles dans le fichier :
============================================================================================================
 
    public Vector lirePortefeuilles()
    {
        // Lit et renvoit les portefeuilles du fichier.
        FileInputStream fic = null;
        ObjectInputStream fic2 = null;
        Object source = null;
        Vector <Portefeuille> v = new Vector <Portefeuille>(15,1);
 
        try
        {
            fic = new FileInputStream(fichier);
            fic2 = new ObjectInputStream(fic);
             
            while(true)    <=== pas beau mais j'ai pas trouvé mieux pour l'instant :(
            {
                    // Tant que le flux nous ramène quelque chose.
                    source = fic2.readObject();
                    if(source instanceof Portefeuille)
                 v.addElement((Portefeuille)source);
            }
        }
        catch(ClassNotFoundException e)
        {
            e.getMessage();
            e.printStackTrace();
        }
        catch(FileNotFoundException e)
        {
            e.getMessage();
            e.printStackTrace();
        }
        catch(EOFException normal)
        {
            try{fic2.close();}   catch(IOException err){err.getMessage(); err.printStackTrace();}
            v.trimToSize();
            return v;
        }
        catch(StreamCorruptedException er)  <==== déclenchée à la lecture de la seconde occurence du fichier !
        {
            er.getMessage();
            er.getCause();
            er.printStackTrace();
            JOptionPane.showMessageDialog(null,"Finish me !" );
        }
        catch(IOException err)
        {
            err.getMessage();
            err.printStackTrace();
        }
        return v;
    }
 
J'obtiens en erreur:
====================
java.io.StreamCorruptedException
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
 at financia.Portefeuille.lirePortefeuilles(InterfaceFinancia.java:219)
 at financia.MenuFinancia.<init>(InterfaceFinancia.java:150)
 at financia.InterfaceFinancia.<init>(InterfaceFinancia.java:23)
 at financia.InterfaceFinancia.main(InterfaceFinancia.java:40)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)
 
C'est comme si la lecture de la seconde occurence fonctionnait mal, créant du coup une corruption du
flux...
 
Bref je sèche complètement sur ce coup alors S.O.S   :sweat:  
 
 
 

mood
Publicité
Posté le 06-08-2005 à 20:36:55  profilanswer
 

n°1171547
thecoin
Chasseur de chasseur de canard
Posté le 07-08-2005 à 10:20:24  profilanswer
 

Tu ne sort jamais de ta boucle  while(true) (c'est mal  :o ), donc quand tu arrives a la fin de ton fichier le fic2.readObject(); se plante

n°1171548
Phendrill
Posté le 07-08-2005 à 10:27:30  profilanswer
 

thecoin a écrit :

Tu ne sort jamais de ta boucle  while(true) (c'est mal  :o ), donc quand tu arrives a la fin de ton fichier le fic2.readObject(); se plante


 
Salut,
 
Si la sortie de ma boucle while(true) est gérée, ça n'est pas une boucle infinie. Quand la fin du flux est atteinte,
une exception EOFException est levée et c'est dans le bloc catch(EOFException err) que le code continue.
 
C'est pas très joli je pense mais j'ai pour le moment pas trouvé mieux.

n°1172068
Phendrill
Posté le 08-08-2005 à 01:15:43  profilanswer
 

up...

n°1172072
glod 2
Votre trajet, notre projet.
Posté le 08-08-2005 à 01:39:26  profilanswer
 

pourquoi tu fais pas while(!fic.EOF) ?

n°1172331
the real m​oins moins
Posté le 08-08-2005 à 13:20:57  profilanswer
 

le truc, c'est que tu sérialises tes objets à la queue leu-leu dans le meme flux de sortie, mais pour la déserialisation, du moins avec readObject(), ton flux "complet" est supposé ne contenir qu'un seul et meme objet.
une solution simple: serialiser ton vecteur, par exemple.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1172403
benou
Posté le 08-08-2005 à 14:25:34  profilanswer
 

the real moins moins a écrit :

pour la déserialisation, du moins avec readObject(), ton flux "complet" est supposé ne contenir qu'un seul et meme objet.


il me semble pas ...


---------------
ma vie, mon oeuvre - HomePlayer
n°1172449
the real m​oins moins
Posté le 08-08-2005 à 15:00:02  profilanswer
 

bon, alors while (source!=null) peut etre?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1172528
victorus_e​cl
PIBCAK
Posté le 08-08-2005 à 15:45:04  profilanswer
 

ça aurait pas un rapport avec le problème montré ici
http://www.infini-fr.com/Sciences/ [...] ation.html
concernant le reset ?

n°1172855
Phendrill
Posté le 08-08-2005 à 21:55:32  profilanswer
 

Citation :

pourquoi tu fais pas while(!fic.EOF) ?

 
 
J'ai tenté...marche pas, j'ai la même erreur.
 

Citation :

le truc, c'est que tu sérialises tes objets à la queue leu-leu dans le meme flux de sortie, mais pour la déserialisation, du moins avec readObject(), ton flux "complet" est supposé ne contenir qu'un seul et meme objet.  
une solution simple: serialiser ton vecteur, par exemple.


 
Ahhh c'est intéressant ça ! ça expliquerait bien mon problème de flux corrompu !
Je tenterai demain de sérialiser le vecteur pour voir ce que ça donne !
 

Citation :

bon, alors while (source!=null) peut etre?

 
 
ça j'ai tenté c'était ce que j'avais fait au départ mais même erreur.
 

Citation :

ça aurait pas un rapport avec le problème montré ici  
http://www.infini-fr.com/Sciences/ [...] ation.html  
concernant le reset ?


 
A priori je dirai que non vu que lui il obtient une erreur OutOfMemoryError ce qui n'est pas mon  
cas...
 
J'essaye peut être de faire quelque chose que je ne peux tout simplement pas faire avec la  
sérialisation non ? Stocker dans un même fichier n objets de type identique, voire n objets
de type identique ET/OU différents ?
 

mood
Publicité
Posté le 08-08-2005 à 21:55:32  profilanswer
 

n°1172954
Profil sup​primé
Posté le 09-08-2005 à 10:23:27  answer
 

Peut-être une piste : ta classe n'a pas été modifiée entre le moment ou tu as sérialisé et le moment ou tu tente de désérialiser ? parcque la moindre modif du code conduit en une version différente de ta classe ...
bon courage


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Problème de sérialisation

 

Sujets relatifs
Probleme de connexion à phpmyadmin[MySQL] Problème de recherche sur 3 tables
Détecter la position de la sourie probleme de click.Problème BDD MySQL chez Free
Problème dans mon code, résultat étrangeProblème de session et objets .....
Probleme de sérialisationprobleme de sérialisation
[java] probleme de serialisation[JAVA] Probleme d'evenements lié a la serialisation(enfin je pense)...
Plus de sujets relatifs à : Problème de sérialisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR