Tom's Guide > Forum > Programmation > [RESOLU] Java: Cast

[RESOLU] Java: Cast

Forum Programmation : [RESOLU] Java: Cast

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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 sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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

Répondre à CRicky

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

Répondre à kicoe

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.

Répondre à CRicky

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

Répondre à kicoe

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 ?

Répondre à CRicky

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?

Répondre à kicoe

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.

Répondre à CRicky

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

Répondre à kicoe

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

Répondre à CRicky

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

Répondre à kicoe

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

Répondre à kicoe
Tom's Guide > Forum > Programmation > [RESOLU] Java: Cast
Aller à :

Il y a 1642 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens