IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

probleme de typage lors de la deserialisation


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut probleme de typage lors de la deserialisation
    Bonjour,

    Je suis entrain de mettre en place un système de serialisation et j'ai quelques problemes lors de la deserialisation.

    Lorsque je serialise mon objet j'enregistre une ArrayList d'object de type MesureAttenuante. Cependant chaque objet n'est pas directement du type MesureAttenuante mais en hérite (car j'ai un systeme de plugin derrière donc de cette manière je n'ai pas besoin de connaitre le code de chaque classe, le code de ma classe abstraite suffit).

    La serialisation de mon objet ne pose pas de probleme cependant lorsque j'essaye de le déserialiser j'ai une erreur ClassNotFound

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    java.lang.ClassNotFoundException: plugin.mesureAttenuante.mehari.MesureFirewall
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Unknown Source)
    	at java.io.ObjectInputStream.resolveClass(Unknown Source)
    	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at mehari.ActionLiee.readObject(ActionLiee.java:173)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    	at java.io.ObjectInputStream.readSerialData(Unknown Source)
    	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at mehari.ActionLiee.load(ActionLiee.java:128)
    	at test.Test.main(Test.java:58)
    Exception in thread "main" java.lang.NullPointerException
    	at test.Test.main(Test.java:59)
    Au début je me suis dit que c'etait normal car je n'avais pas la classe MesureFirewall (qui herite de MesureAttenuante). Donc j'ai redéfini la fontion readObject comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	private void readObject(java.io.ObjectInputStream in) throws IOException,ClassNotFoundException {
    		in.defaultReadObject();
    		int nb = in.readInt();
    		lesMesuresAttenuantes = new ArrayList<MesureAttenuante>();
    		for(int i=0;i<nb;i++){
    			MesureAttenuante ma = (MesureAttenuante) in.readObject();
    			lesMesuresAttenuantes.add(ma);
    		}
    De cette manière je pensais casté mon object selon ma classe MesureAttenuante mais apparemment cela ne change rien.

    Quelqu'un saurait comme je pourrais caster les objets que je lis comme objets MesureAttenuante et non plus comme objet héritant de MesureAttenuante ?

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il n'existe aucun moyen.

    Ce n'est même pas propre à la sérialisation : à partir du moment où, quelque part dans un code java tu utilises un objet de classe Toto, alors il te faut cette classe Toto dans ton classpath, y compris si tu n'utilises cet objet qu'en le déclarant comme Object, donc y compris si tu ne cites nulle part dans ton code la classe Toto.

    Désolé il faut que tu trouves autre chose.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    Ce n'est même pas propre à la sérialisation : à partir du moment où, quelque part dans un code java tu utilises un objet de classe Toto, alors il te faut cette classe Toto dans ton classpath, y compris si tu n'utilises cet objet qu'en le déclarant comme Object, donc y compris si tu ne cites nulle part dans ton code la classe Toto.
    Ce n'est pas vrai. En effet j'ai bien déclaré des objets implémentant une Interface dans un projet. J'en fais des .jar et lorsque dans mon projet je les charge je les instancie comme type de mon interface. Cela marche sans problème. Je manipule les objets sans pour autant en avoir le code ni même le type.

    Sinon pour la serialisation, mes recherches semblent me faire dire pareil que toi. Ce n'est pas possible. Je vais donc hierarchiser mes projets différent.

    Merci pour ta réponse gifffftane

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Peut être ai-je mal compris, ou peut être me suis-je mal expliqué.

    Soit une classe toto.Clazz implémentant l'interface Face.

    Admettons la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Face uneface = (Face)Class.forName("toto.Clazz").newInstance();
    Ceci déclanchera une exception ClassNotFoundException si la classe toto.Clazz n'est pas dans le classpath.

    Et de toutes façons, si une classe n'est pas dans le classpath, ou au moins dans un truc d'un ClassLoader, tu n'as aucun moyen de t'en servir, pas même d'en avoir une instance, que ce soit par désérialization ou autrement.

    Cela ne t'empêche bien entendu pas, comme tu sembles l'avoir fait, de déclarer des objets selon une interface et de les charger dans cette interface, et même d'ignorer complètement de quelle classe exactement ils sont. Sauf que la JVM, elle, le sait (heureusement), et que leur classe est bien accessible par le classpath à un endroit ou à un autre.

    Sauf à avoir un ClassLoader spécial, qui tienne compte d'autre chose que du classpath. Peut être est-ce ton cas ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 72
    Par défaut
    En faite j'ai redéfini un ClassLoader pour qu'il aille chercher les classes dans les .jar et tout de suite apres je caste mon objet selon mon interface commune aux deux projets. Du coup je n'ai pas besoin explicitement du code de la classe (mais le .class est bien dans le .jar).

    Ca revient donc bien a ce que tu viens de dire.

    Sinon pour mon problème je l'ai résolu sans utiliser de serialisation. J'ai fait un systeme de plugin entre 4 projets. Du coup je me traine pas mal d'interface et de classe abstraite pour les manipuler mais cela semble assez bien marcher.

    C'est un peu moins jolie comme solution que ce que je voulais faire au début mais je suis assez content de moi tout de même.

    Merci pour ton aide gifffftane

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [type complex] problemes bizzards lors de la deserialisation
    Par djynwk dans le forum Services Web
    Réponses: 6
    Dernier message: 23/11/2006, 18h43
  2. problème de blocage lors de démarrage
    Par leo13 dans le forum Ordinateurs
    Réponses: 16
    Dernier message: 05/05/2006, 19h07
  3. Probleme de cache lors de la recup d'une page web
    Par firejocker dans le forum MFC
    Réponses: 1
    Dernier message: 22/12/2005, 17h00
  4. Probleme de BIP lors de la lecture d'un fichier
    Par GroRelou dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/09/2005, 10h12
  5. [C#] Problème de Date lors d'un Insert
    Par BilTCD dans le forum ASP.NET
    Réponses: 5
    Dernier message: 22/08/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo