Besoin d'aide sérialisation java [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
vendredi 31 octobre 2014
Statut
Membre
Dernière intervention
3 décembre 2014
-
Messages postés
13
Date d'inscription
vendredi 31 octobre 2014
Statut
Membre
Dernière intervention
3 décembre 2014
-
Bonjour, j'essaie de sérialiser un objet d'une classe que j'ai créé. Mon but est de pouvoir d'une session à l'autre du terminal pouvoir recharger cette objet avec les modifications qui ont été effectué, tout en sachant que parmi ses variable d'instances cet objet possède des ArrayList, des int et des objets de classe que j'ai créé.

(Mon bout de programme un peu plus bas)

Celui-ci compile bien mais à l'exécution de la méthode sérialisation dans lequel je rentre en paramètre l'objet de la classe Objet qui m'intéresse cela m'affiche erreur1 donc ça veut dire que je suis dans l'exception et je ne sais pas pourquoi. (je ne sais pas ce que signifie ce qui est à l'intérieur du catch mais je suppose que ça veut dire si il arrive pas à faire ce qui est au dessus).

Sinon en prévision pour la sérialisation, cela va bien marché si je fais dans ma main : désérialisation(Objet a) ou a existe déjà car a été créé plus haut? Je veux que ça le modifie pour prendre ce que yavait au moment de la dernière sauvegarde.

Merci pour votre aide.
public static void sérialisation(Objet a)
 {
   ObjectOutputStream out;
    
    
  {out = new ObjectOutputStream(
                new BufferedOutputStream(
                   new FileOutputStream(
                     new File("sav.txt"))));
   
   out.writeObject(a);
   out.close();
  }
   catch( IOException e ) {System.out.println("erreur1");} 

     
  }

 public static void désérialisation(Objet a)
 {Interface interface2;
  ObjectInputStream in;
  try 
  {
      in = new ObjectInputStream(new FileInputStream("monFichier.sav"));
     a = (Interface)in.readObject();
      in.close();
 
  }
   catch( ClassNotFoundException e1 ) {
 

 } catch( IOException e2 ) {}



EDIT : Ajout des balises de code

2 réponses

Messages postés
16180
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 janvier 2021
2 775
Bonjour,

"Celui-ci compile bien"
Étonnant, comment ton catch pourrait-il fonctionner sans try ?

System.out.println("erreur1")
:
Si tu as une exception le plus intéressant est de savoir ce que c'est. "erreur1" ce n'est pas suffisant, fait un e.printStackTrace() plutôt, et indiques nous l'erreur.

void désérialisation(Objet a)
:
Ton paramètre ne sert à rien, tu ne vas pas pouvoir modifier l'objet qui est passé en paramètre, ce qu'il te faut c'est une méthode qui retourne l'objet désérialisé, comme un getteur :
Objet désérialisation()
...
Remarque : il serait logique de passer les fichier à lire ou écrire en paramètre de la méthode,
Objet désérialisation(File file)
par exemple.

new File("sav.txt")
,
new FileInputStream("monFichier.sav")
:
Pourquoi avoir deux noms de fichiers différents ? J'imagine que le but est pourtant de désérialiser ce que tu as sérialisé au départ, non ? Donc il faudrait les deux même fichiers.
Remarque : par convention, l'extension d'un fichier pour les objets sérialisés est .ser

Remarque : par convention toujours, on n'utilise que des lettres anglaises dans les noms en Java, et généralement des noms en anglais, donc
void serialization(File ser, Serializable obj)
et
Serializable deserialization(File ser)
...
La confiance n'exclut pas le contrôle
Messages postés
13
Date d'inscription
vendredi 31 octobre 2014
Statut
Membre
Dernière intervention
3 décembre 2014
1
Salut, merci pour ton aide.

J'ai rajouter le catch qui manque et j'ai changé le nom des dossier.

L'erreur est au même endroit et après avoir mis ce que tu m'as dit ça affiche :


java.io.NotSerializableException: Interface
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at Interface.sérialisation(Interface.java:407)
at Interface.main(Interface.java:373)


où Interface c'est le nom de ma classe .

A la ligne 373 je fais appel à la méthode sérialisation.

La ligne 407 c'est out.writeObject(a); de ma méthode sérialisation.
Messages postés
16180
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 janvier 2021
2 775
Vu le message d'erreur une question se pose : est-ce que ta classe Interface est sérialisable ?
Remarque : appeler une classe "Interface" est assez déconcertant...

Pour être sérialisable une classe doit :
1) implémenter l'interface Serializable
ET 2a) avoir tous ses arguments Serializable ou transient
OU 2b) redéfinir les trois méthodes de l'interface Serializable
Messages postés
13
Date d'inscription
vendredi 31 octobre 2014
Statut
Membre
Dernière intervention
3 décembre 2014
1
En fait la classe Interface c'est ma classe Test mais j'ai fais en sorte qu'elle permette de tester toutes les fonctionnalités des autres classes depuis la boite de commande (cf mon autre message sur le forum auquel tu as répondu).

Mais merci, c'était bien ça le problème, je n'avais pas implémenter l'interface Serializable dans toutes les classes qui sont liées avec celle que j'essaie de sérialiser.