[RESOLU] Java: Cast - Programmation
Ceci répond-il à votre question ? Oui | Non
 

Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [RESOLU] Java: Cast
 
Profil : IDNaute
Plus d'informations

je cherche a déserialiser un Objet de type "Identifiant" (qui a été correctement serialisé avant), mais quand je cherche a le récupérer, ca me met:
Exception in thread "main" java.lang.ClassCastException

j'ai pourtant bien rajouté "implements Serializable"...
et j'y arrivais tres bien avec un Vector dans un autre contexte...

voici le Cast qui bloque:
(bde de type Identifiant)

Code :
  1. try{
  2.             System.out.println("\n Lecture du fichier\n" );
  3.             String nomFic = "acces.bde";  // nom du fichier
  4.             File  f1 = new File(nomFic);
  5.             // définition d'un flot en lecture
  6.             FileInputStream fis = new FileInputStream(f1);
  7.             ObjectInputStream ois = new ObjectInputStream(fis);
  8.             // on lit le flot et on récupère dans un Identifiant
  9.             bde = (Identifiant)ois.readObject();
  10.             ois.close();    // on ferme le flot

Liens

Profil : IDNaute
Plus d'informations

Si:
- ta classe Identifiant implemente bien serializable
- bde est une instance de Identifiant
- le fichier contient bien une instance serialisée de Interface
alors oui ce code devrait marcher (vérifie bien la 3ème condition).

Profil : IDNaute
Plus d'informations

c tout bon... les dieux du java sont contres moi $^^

Profil : IDNaute
Plus d'informations

Es-tu certain qu'avec ce programme, la classe Identifiant est exactement la même que celle que tu as utilisée lors de l'écriture dans le fichier ?

Je m'explique. Les étapes suivantes amenent à ce problème:
1. tu crée ton programme de base
2. tu crée un fichier toto.dat à partir de ce programme
3. tu modifies ta classe Identifiant, par exemple en ajoutant une variable membre
4. tu essaie de lire le fichier avec la classe Identifiant.
Et bien, ici tu as une erreur, car même si la classe porte le même nom et qu'elle est à 99% la même, comme le contenu n'est pas exactement le même, les octets sérialisés ne le sont pas également: le programme ne reconnait plus les données sérialisée.

C'est pour ça que j'insistais sur le dernier cas, mais je n'avais pas donné assez d'explications.

Profil : IDNaute
Plus d'informations

g fait des inner class de Identifiant dans ma classe qui serialise, et dans celle qui deserialise...
tout en copier-coller :s

Profil : IDNaute
Plus d'informations

C'est la classe qui sérialise qui est serialisé. Si c'est Identifiant qui doit etre serialisé, c'est elle qui doit implementer l'interface Serializable (je sais plus le nom exact) pas la classe au dessus.

je vois pas trop ta structure, tu as fait ça d'après ce que j'ai compris:

Code :
  1. class A: implements Serializable {
  2. class Identifiant {
  3. ...
  4. }
  5. ...
  6. }


et pareil avec une classe B ?
Dans ce cas tu as 2 classes Identifiant différentes une dasn A et une dans B ?

Profil : IDNaute
Plus d'informations

euh... oui! prkoi, il ne faut pas?
mais si je ne le fait pas, comment la classe qui déserialise connait le type d'objet qu'elle doit récuperer apres, dans le cast?

Profil : IDNaute
Plus d'informations

Je ne me rappelle plus trop de comment ça marche.
Mais si tu fais une classe simple Identifiant (pas inner).
que tu implemente serialisable, ça devrait marcher. C'est la classe qui se sérialise elle-même.

Code :
  1. class Identifiant implements serializable {
  2. ...
  3. }


tu redéfinis la méthode, et tu envois simplement dans ton fichier une instance de Identifiant.

Profil : IDNaute
Plus d'informations

et apres, quand je déserialise, je fais comment?
en fait, je veux compiler et executer avec un batsh, mais le truc c'est que j'ai remarqué que je si je compilais un fichier java, puis un autre, l'autre ne connaissais pas le permier...

Profil : IDNaute
Plus d'informations

et bien pareil.
Je ne me rapelle plus, mais s'il y a une interface du genre Deserialisable (je pensais qu'il n'y en avait qu'une et qu'elle faisait dans les 2 sens), et bien tu l'implémente aussi dans la même classe et tu ne touche pas le code de ton premier post qur tu mets ailleurs dans une autre classe.

Pour la compilation, il faut faire un "import" de ta classe et bien mettre la variable d'environnement CLASSPATH à jour (ou l'indiquer en ligne de commande).

Profil : IDNaute
Plus d'informations

mieux vaut l'indiquer en ligne de commande, mais comment je fais?
javoue avoir bcp de mal avec les classpath

Profil : IDNaute
Plus d'informations

en fait, fallait créer un package, faire un import, et zapper les inner class!
mici!


Aller à :
Ajouter une réponse
  FORUM Infos-du-Net » Programmation » [RESOLU] Java: Cast
 

Liens