Se connecter avec
S'enregistrer | Connectez-vous

[RESOLU] Java: Cast

Dernière réponse : dans Programmation

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)
  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.  
  6. // définition d'un flot en lecture
  7. FileInputStream fis = new FileInputStream(f1);
  8. ObjectInputStream ois = new ObjectInputStream(fis);
  9.  
  10. // on lit le flot et on récupère dans un Identifiant
  11. bde = (Identifiant)ois.readObject();
  12. ois.close(); // on ferme le flot

Autres pages sur : resolu java cast

Lassé par la pub ? Créez un compte
Expert Programmation

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).
Expert Programmation

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.
Expert Programmation

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:
  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 ?
Expert Programmation

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.
  1. class Identifiant implements serializable {
  2. ...
  3. }

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

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...
Expert Programmation

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).
Lassé par la pub ? Créez un compte
Tom's guide dans le monde