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 :

PB java.io.NotSerializableException java.rmi.UnmarshalException


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 26
    Par défaut PB java.io.NotSerializableException java.rmi.UnmarshalException
    Bonjour à tous,
    J'utilise RMI pour transférer des données d'un serveur à un client java.
    Cette méthode fonctionne correctement excepté lorsque j'utilise une librairie .jar.
    La compilation côté serveur est OK mais côté client, j'ai le message d'erreur suivant:
    <code>
    Erreur d'accès à un objet distant
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ij.ImageStack
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ij.ImageStack
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(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.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
    ... 7 more
    Caused by: java.io.NotSerializableException: ij.ImageStack
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeArray(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    java.lang.NullPointerException
    at panelP.setImageStacks(panelP.java:1363)
    </code>
    Normalement, il faudrait rendre serializable toutes les classes qui transitent sur le réseau mais, là, je ne peux pas parce que la classe est issue d'une library dans laquelle je ne peux rien modifier.
    D'abord est ce que c'est possible et si oui, est ce que qqun aurait une solution??
    Merki

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Es tu certain que ImageStack ne soit pas sérialisable ???

    Si c'est le cas j'ai bien peur que ton problème n'ait pas de solution.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    Salut, j'avoue que la problematique que tu as soulevée est interessante.

    Effectivement tu n'as aucun moyen de faire transiter ton objet par RMI si ce dernier n'est pas serializable, ce qui est le cas de la classe ImageStack de l'api ImageJ.

    Pour autant, je ne suis pas d'accord avec thibaut, quand il dit qu'il n'y ait pas de solution.

    Il n'y a pas de solution simple certes, mais si tu en a vraiment besoin, c'est realisable.
    Comment ? la solution qui me vient à l'esprit est l'introspection.

    J'ai fait une recherche sur ta classe et j'ai trouvé les sources http://rsb.info.nih.gov/ij/docs/source/index.html

    On peut y voir que les membres de la classe sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        private int nSlices = 0;
        private Object[] stack;
        private String[] label;
        private int width, height;
        private Rectangle roi;
        private ColorModel cm;
        private double min=Double.MAX_VALUE;
        private double max;
        private float[] cTable;
    Qu'aurait fait la serialisation? elle aurait fait transiter les valeurs des membres de ton objet par RMI, aurait instancier un nouvel objet de l'autre coté et rempli ses membres avec ses valeurs.

    Ce que je te propose c'est de te creer une classe qui contient tous ces champs et qui soit serialisable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class ImageStackContent implements Serializable
    {
        public int nSlices = 0;
        public Object[] stack;
        public String[] label;
        public int width, height;
        public Rectangle roi;
        public ColorModel cm;
        public double min=Double.MAX_VALUE;
        public double max;
        public float[] cTable;
    }
    Comme les membres de ImageStack sont privés, on ne peut malheureusement pas simplement les copiés dans notre classe "maison".

    Du coup on va utiliser l'introspection.

    exemple pour acceder au champ max

    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
    try
    		{
    			ImageStack is = new ImageStack(10, 10);  // A remplacer par ton instance de ImageStack
    			Field maxField = ImageStack.class.getDeclaredField("max"); // On accede au champs max de la classe ImageStack
    			maxField.setAccessible(true); // On authorise la consultation du champ
    			double maxFieldValue = maxField.getDouble(is); // On lit le contenu du champ
    			System.out.println("Value : " + maxFieldValue);
    		}
    		catch (IllegalArgumentException e)
    		{
    			e.printStackTrace();
    		}
    		catch (IllegalAccessException e)
    		{
    			e.printStackTrace();
    		}
    		catch (SecurityException e)
    		{
    			e.printStackTrace();
    		}
    		catch (NoSuchFieldException e)
    		{
    			e.printStackTrace();
    		}
    Tu peux ainsi remplir l'instance de ta classe "maison" avec les valeurs de l'instance ImageStack puis envoyer ta classe par RMI, la recupérée coté serveur et reconstruire un ImageStack à l'identique

    voici la méthode pour reconstruire l'objet ImageStack

    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
    		try
    		{
    			ImageStack is = new ImageStack(10, 10);
    			Field maxField = ImageStack.class.getDeclaredField("max");
    			maxField.setAccessible(true);
    			maxField.setDouble(is, myImageStackContent.max); // On assigne la valeur du champ max de notre objet ImageStackContent au champ max de l'objet ImageContent
    		}
    		catch (SecurityException e)
    		{
    			e.printStackTrace();
    		}
    		catch (IllegalArgumentException e)
    		{
    			e.printStackTrace();
    		}
    		catch (NoSuchFieldException e)
    		{
    			e.printStackTrace();
    		}
    		catch (IllegalAccessException e)
    		{
    			e.printStackTrace();
    		}
    J'espère que ca t'aidera

Discussions similaires

  1. [Framework] [RMI] java.rmi.UnmarshalException
    Par YokoSop dans le forum Spring
    Réponses: 12
    Dernier message: 08/12/2010, 15h29
  2. [EJB3 Entity] java.rmi.UnmarshalException: ClassNotFoundException
    Par matthieu86 dans le forum Java EE
    Réponses: 1
    Dernier message: 01/03/2009, 17h46
  3. [RMI] java.rmi.UnmarshalException
    Par anicaise dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 06/06/2008, 10h34
  4. java.io.NotSerializableException tomcat eclipse
    Par newmar dans le forum Struts 1
    Réponses: 2
    Dernier message: 21/04/2008, 11h07
  5. java.lang.ClassCastException avec RMI
    Par yozine dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/06/2007, 22h19

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