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

Entrée/Sortie Java Discussion :

serialization d'objets dans un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut serialization d'objets dans un fichier
    Bonjour à tout le monde
    Mon problème c’est que je n’arrive pas à lire un fichier qui contient un ensemble d’objet que j’ai serializer dedans.
    La première lecture ce fait avec succès mais lorsque je tente a lire le suivant une erreur d’IOException s’affiche.

    Voici comment je fais pour lire un objet.
    Je refait la même chose pour lire le suivant.


    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
       FileInputStream Finp = null;
      ObjectInputStream Oinp = null;
      try {
        Finp = new FileInputStream(sauvegarde);
      }
      catch (FileNotFoundException ex) {
      }
     
      try {
        Oinp = new ObjectInputStream(Finp);
      }
      catch (IOException ex1) {
      }
     
     
     fiche fcurrent = null;
      try {
        fcurrent = (fiche) Oinp.readObject();
        System.out.println(fcurrent.GetID());
      }
      catch (ClassNotFoundException ex2) {
      }
      catch (IOException ex2) {
      }
    pour serializer un objet je fait
    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
     
    public void savefiche(fiche f){
      FileOutputStream fr = null;
      ObjectOutputStream br=null;
     
      try {
        fr = new FileOutputStream(sauvegarde,true);
        br= new ObjectOutputStream(fr);
        br.writeObject(f);
     
      }
      catch (IOException ex) {
     
      }
     
      }

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Si tu n'affiche pas la trace des exceptions tu auras du mal à découvrir la source de l'erreur. Rajoute un printStackTrace dans chaque bloc catch
    cf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch(Exception ex) {
        ex.printStackTrace();
    }
    Tu devrais avoir un message d'erreur t'indiquant plus exactement ton erreur. Si tu ne parviens toujours pas à résoudre ton problème, poste le message d'erreur complet.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    OK j'ai ajouter la trace d'exception et voici l'erreur

    java.io.StreamCorruptedException

    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1301)

    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)

    at call.Restore.restore(Restore.java:57)

    at call.Restore.main(Restore.java:85)

    ça vien de cette ligne.

    fcurrent = (fiche) Oinp.readObject();

    comme j'ai dis la lecture est réussi la première fois mais la 2nd non

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Je pense que juste apres avoir fait l'affichage de ton getID() tu devrai fermer les flux
    finp et oinp comme ceci:

    finp.close();
    oinp.close();

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Yan17
    Je pense que juste apres avoir fait l'affichage de ton getID() tu devrai fermer les flux
    finp et oinp comme ceci:

    finp.close();
    oinp.close();
    ça deviend plus pire voici le message d'erreur
    java.io.IOException: Bad file descriptor

    at java.io.FileInputStream.read(Native Method)

    at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2133)

    at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2423)

    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2433)

    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1245)

    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)

    at call.Restore.restore(Restore.java:59)


    Le problème peut être que dans un fichier nous devons serialiser un seul objet

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Oui tu peut essailler de ne serialiser qu'un seul objet dans le fichier, juste pour voir. Perso j'ai toujours serialise uniquement un seul objet par fichier.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Je pense que je doit sauvegarder chaque objet dans un fichier a part puis les restorer

    je doit alors savoir le nbr de fichiers ...

    c décourageant mais j'ai pas le choix

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    sinon tu as une solution plus simple , j'ai fais comme cela et ainsi tu va serialiser tout tes objets dans un seul fichier.

    Voila la principe:

    tu creer une class ,que tu nomme comme tu veux, cette class sera unique et regroupera l'ensemble des autres objets que tu voudra serialiser. Cette class implementera Serializable.

    Dans cette class tu cree un ArrayList
    dans cette arrayList tu ajout (methode add()) les autres objet que tu veux voir serialiser. Comme arrylist est elle meme serialisable, lorsque tu va demander de serialiser cette nouvelle class unique la serialisation va aussi serialiser les objets qui se trouve dans le arrayList

    Bon mais avec cela il faut rajouter un methode getList() dans le nouvelle class pour recuperer les objets qu'elle contient.

    Voici un exemple en code

    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
    package main.gamebase.space;
     
    import java.io.Serializable;
    import java.util.ArrayList;
     
     
    public class Entity implements Serializable{
     
    	private static final long serialVersionUID = 1L;
    	private ArrayList childList=null;
     
    	public Entity(){
              childList=new ArrayList();
    	}
     
    	public void addChild(Object o){
    		childList.add(o);
    	}
     
    	public void removeChild(Object o){
     
    			getChildList().remove(o);
     
    	}
     
    	public ArrayList getChildList(){
    		if(childList==null){
    			childList=new ArrayList();
    		}
    		return childList;
    	}
     
    }
    il ne reste plus qu'a serialiser cette class et hop tout les objets qui sont dans le childList le seront aussi et tu pourra les recuperer avec getChildList();

    ps: j'ai tappe le code a la main sans IDE donc il y a peut-etre des fautes

  9. #9
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Merci pour ton aide.

    Le problème c’est que je veut faire le sérialization a la volet. De ta façon je dois avoir tous les objets.
    Je ferais alors comme suit
    A chaque fois je vais écraser le fichier et le reconstruire à nouveau. De cette façon et à chaque nouveau objet je le rajoute a la liste et je la réserialise .

  10. #10
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Le problème vient de ta façon de sérialiser tes objets. C'est cette ligne qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fr = new FileOutputStream(sauvegarde,true);
    . Il faut donc que tu sérialises tous tes objets dans le même FileOutputStream.

    A+
    Hydraland

  11. #11
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    C bien ça le problème c bien résolue merci

    Si je récapitule.

    Pour serializer pls objet dans un fichier.
    il faut ouvrir une seule fois l'outputstream vers ce fichier ainsi l'objectoutputstream.
    puis ecrire dans ce fichier les objet un par un

    enfin pour lire c idem


    Merci pour tout ceux qui m'on aider a résoudre ce problème et j'espère que cette discution serait utile pour d'autres personnes.

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

Discussions similaires

  1. Ecrire un objet dans un fichier
    Par skeltryx dans le forum C#
    Réponses: 3
    Dernier message: 11/05/2007, 13h31
  2. Serialization d'objet dans un ByteBuffer
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 20/04/2007, 20h03
  3. Ecrire un objet dans un fichier
    Par mikebranque dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2006, 13h39
  4. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55

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