enregister un objet dans un fichier

enregister un objet dans un fichier - Java - Programmation

Marsh Posté le 04-01-2005 à 18:55:47    

Bonjour, je souhaite pouvoir enregistrer un objet grace à la serialisation.
voila mon code :
 
public void save(File f){
try {  
   FileOutputStream fichier = new FileOutputStream(f);
   ObjectOutputStream oos = new ObjectOutputStream(fichier);
   oos.writeObject(this);
   oos.flush();  
   oos.close();
}
catch (java.io.IOException e) {
e.printStackTrace();
}
}
 
ce code fonctionne trés bien pour des petits objets, mais qd je l'utilise sur un autre objet, l'erreur satckoverflow est levée !
 
Est ce que ceci pourrait venir d'une faite que je veut serialiser un objet1, qui contient un objet2, et que cette objet2 à un pointeur vers l'objet1 ??
 
Merci de votre aide

Reply

Marsh Posté le 04-01-2005 à 18:55:47   

Reply

Marsh Posté le 04-01-2005 à 19:00:25    

j'ai eu le souci récemment, j'ai trouvé ça comme explication (le dernier post)
 
http://groups.google.fr/groups?hl= [...] eb7&rnum=2

Reply

Marsh Posté le 04-01-2005 à 19:36:48    

J'ai fait un test tout con pour sérialiser un objet contenant des références croisé comme une liste doublement chainé et effectivement cela lance un java.lang.StackOverflowError.
L'explication est donné dans le lien d'Harko
EDIT : J'ai raconté des conneries, mon stack overflow venait de mon implementation de la méthode toString  :fou:  
En fait la sérialisation se passe sans problême


Message édité par phnatomass le 04-01-2005 à 19:49:15
Reply

Marsh Posté le 04-01-2005 à 19:47:11    

essayez xstream à l'occasion: ça marche bien, c'est hyper simple, et le resultat est lisible :)
 
(et dites ce que ça donne sur vos gros objets qui overflowent le stack)


Message édité par the real moins moins le 04-01-2005 à 19:47:51

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

Marsh Posté le 04-01-2005 à 20:15:57    

Reply

Marsh Posté le 04-01-2005 à 20:23:43    


bah... pourquoi  :??: ?
Moi je sérailise à fond en ce moment, et j'me disais qu'un moyen simple d'enregistrer des objets, ce serait la classe
 
ça m'plait bien ce truc à moi..

Reply

Marsh Posté le 04-01-2005 à 20:25:51    

private joke, pas grave ;)


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

Marsh Posté le 04-01-2005 à 22:25:48    

Ok merci à tous, je vais tout esseyer

Reply

Marsh Posté le 05-01-2005 à 10:07:58    

je connaissais pas xstream :)
Ça tient la route ?

Reply

Marsh Posté le 05-01-2005 à 11:57:08    

non c'est pour ça que je l'ai conseillé [:kiki]


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

Marsh Posté le 05-01-2005 à 11:57:08   

Reply

Marsh Posté le 05-01-2005 à 14:45:27    

jai voulu tester XSTREAM qui a l'air pas mal du tout, seulement il semblerait que ca ne marche pas avec un Applet, ca genere un "AccessControlException: access denied" :(
si quelqu'un a reussi a faire marcher la librairie avec un applet. ca m'interresse..

Reply

Marsh Posté le 05-01-2005 à 14:54:31    

la question à été soulevée y'a pas lgtps sur la mailing list, va jeter un oeil aux archives
http://archive.xstream.codehaus.org/user/


Message édité par the real moins moins le 05-01-2005 à 14:54:53

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

Marsh Posté le 05-01-2005 à 19:25:36    

the real moins moins a écrit :

private joke, pas grave ;)


 
d'accord, ça me rassure merci pour la découverte en tous cas :)
 
 
(nraynaud je l'ai vu dire pas mal de trucs constructifs alors c'est vrai, je pense pas tout de suite à une blague)

Reply

Marsh Posté le 05-01-2005 à 19:35:43    

raytaller a écrit :

(nraynaud je l'ai vu dire pas mal de trucs constructifs alors c'est vrai, je pense pas tout de suite à une blague)


tu couperas ça avant "alors" pendant le montage coco !

Reply

Marsh Posté le 05-01-2005 à 20:00:33    

nraynaud a écrit :

tu couperas ça avant "tructifs" pendant le montage coco !


:jap:


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

Marsh Posté le 08-01-2005 à 14:14:37    

une question qui est peut etre bete. on peut sauver plusieurs objets, de meme type bien sur, dans un meme fichier ?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 14:15:55    

oui, même si ils sont pas de même type ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 14:37:20    

benou a écrit :

oui, même si ils sont pas de même type ...


:)
Ma sauvegarde a l'air de bien fonctionner, maintenant je regarde comment recuperer l'ensemble de mes objets qui sont dans mon fichier. Car pour en recuperer un, ca a l'air simple, mais plusieurs ;)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 14:39:21    

while [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 14:41:57    


Code :
  1. try {
  2.        ObjectInputStream flotLecture = new ObjectInputStream( new FileInputStream("monfichier.txt" ));
  3.        Object lu = flotLecture.readObject();
  4.        if (lu instanceof operation)
  5.           {
  6.            operation temp=(operation)lu;
  7.   //ajouter l'option operation au vecteur
  8.   monVec.ajout(tmp);
  9.           }
  10.     }


 
intercaler un while avec un eof ?
operation c'est un objet à moi (je sais que le nom n'est pas génial ;))


Message édité par Le Veilleur le 08-01-2005 à 14:42:35

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 14:44:37    

while (in.available() != 0)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 14:47:42    

benou a écrit :

while (in.available() != 0)


Code :
  1. try {
  2.        ObjectInputStream flotLecture = new ObjectInputStream( new FileInputStream("monfichier.txt" ));
  3.      
  4.    Object lu = flotLecture.readObject(); 
  5.    while (lu.available() != 0)
  6.      {
  7.      
  8.        if (lu instanceof operation)
  9.           {
  10.            operation temp=(operation)lu;
  11.   //ajouter l'option operation au vecteur
  12.   monVec.ajout(tmp);
  13.             }
  14.         lu = flotLecture.readObject();
  15.        }
  16.     }


 
je vais tester ca ;)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 14:55:41    

nan mais là non ... c'est l'inputstream qu'il faut tester avec available ... et le premier read faut le mettre dans la boucle aussi ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 15:02:56    

oups  :pt1cable:  
 

Code :
  1. //Permet de lire des objets et de les mettre dans le vecteur d'objets  
  2.  public void lireObjet()
  3.  {
  4. try {
  5.       ObjectInputStream flotLecture = new ObjectInputStream( new FileInputStream("objet.txt" ));
  6.      
  7.       //lecture du premier objet
  8.       Object lu ; 
  9.       while (flotLecture.available() != 0)
  10.           {
  11.            lu = flotLecture.readObject();
  12.            if(lu instanceof operation)
  13.              {
  14.               operation temp=(operation)lu;
  15.            //ajouter l'option operation au vecteur
  16.           ajout(temp);
  17.              }
  18.           }
  19.       }
  20.   catch (java.io.IOException e) {
  21.            e.printStackTrace();
  22.            }
  23.  }


 
Faut encore que je catch cette exception

Citation :

unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown


 
sur le  
 

Code :
  1. lu = flotLecture.readObject();


 
je garde espoir :D


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 15:06:23    

Code :
  1. catch (ClassNotFoundException e) {
  2.       e.printStackTrace();
  3.     }


 
je teste et croise les doigts :p car j'aurais presque fini :p


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 15:28:42    

Ca commence mal...
 
Il ne passe déjà pas la boucle
while (flotLecture.available() != 0)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 15:56:42    

c'est vraiment pas beau ce que je viens de faire, mais ca fonctionne, j'ai fait un while(1==1) donc ca lit, et car ca plante, ca appele l'execption et sort de la boucle. c'est immonde, mais ca fonctionne :p


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 16:10:15    

while(true) tant qu'à faire ...
 
c'est quoi le problème avec available ? c'est quoi le message d'erreur ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 16:12:39    

il ne fait pas de msg d'erreur avec available, il ne passe meme pas dans la boucle. Ce qui voudrait dire que flotLecture.available() == 0, ce qui me semble bizarre
 
quoique

Citation :

public int available()
              throws IOException
 
    Returns the number of bytes that can be read without blocking.


 
qu'est ce que veut dire blocking....


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 08-01-2005 à 16:43:40    

peut être que c'est juste utilisable pour les stream avec buffer :/
 
dans ce cas, je vois pas d'autre solution que de catcher EOFException pour savoir quand le flux est fini :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 08-01-2005 à 16:53:06    

ben si, mettre le nombre d'objet de début de fichier, genre un Integer, et hop :o

Reply

Marsh Posté le 08-01-2005 à 17:23:04    

oui c'est moins sale, mais bon, pas génial non plus :( enfin comme ca c'est bon, je barratinerais le prof sur le sujet ;)
 
merci pour votre aide


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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