Problème de sérialisation

Problème de sérialisation - Java - Programmation

Marsh Posté le 06-08-2005 à 20:36:55    

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:  
 
 
 

Reply

Marsh Posté le 06-08-2005 à 20:36:55   

Reply

Marsh Posté le 07-08-2005 à 10:20:24    

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

Reply

Marsh Posté le 07-08-2005 à 10:27:30    

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.

Reply

Marsh Posté le 08-08-2005 à 01:15:43    

up...

Reply

Marsh Posté le 08-08-2005 à 01:39:26    

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

Reply

Marsh Posté le 08-08-2005 à 13:20:57    

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 ?
Reply

Marsh Posté le 08-08-2005 à 14:25:34    

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
Reply

Marsh Posté le 08-08-2005 à 15:00:02    

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 08-08-2005 à 15:45:04    

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

Reply

Marsh Posté le 08-08-2005 à 21:55:32    

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 ?
 

Reply

Marsh Posté le 08-08-2005 à 21:55:32   

Reply

Marsh Posté le 09-08-2005 à 10:23:27    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed