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

Java Discussion :

[Sérialisation] d'objets de types différents


Sujet :

Java

  1. #1
    Membre habitué
    Avatar de Amnesiak
    Profil pro
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 151
    Points
    151
    Par défaut [Sérialisation] d'objets de types différents
    Bonjour,

    Je développe une application client/serveur communiquant par objets sérialisés au moyen d'un flux ObjectOutputStream. Les objets sérialisés pouvant être de types différents, je suis confronté à un petit problème :

    Tant que mon client transmet les objets dans un ordre déterminé (et connu du serveur), tout fonctionne sans souçis. Ce dernier sait en effet, à quel type d'objet s'attendre et peut le désérialiser correctement. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Client (sérialise les objets sur le flux réseau)
    ObjectOutputStream oos = new ObjectOutputStream(maSocketClient.getOutputStream());
    oos.writeObject(new Truc());
    oos.writeObject(new Machin());
    oos.writeObject(new Bidule());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Serveur (désérialise)
    ObjectInputStream ois = new ObjectInputStream(maSocketServeur.getInputStream());
    Truc t = (Truc)ois.readObject();
    Machin m = (Machin)ois.readObject();
    Bidule b = (Bidule)ois.readObject();
    Par contre, imaginez par exemple que l'utilisateur puisse décider de l'objet à envoyer sur le flux (au moyen d'une interface graphique par exemple). Comment puis-je savoir, au niveau de mon serveur, quel type d'objet je dois récupérer, et comment l'instancier ?
    J'ai essayé de le récupérer dans la classe générale Object, à partir duquel je peux trouver le nom de la classe, etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Object o = ois.readObject();
    if (o.getClass().getName().compareTo("Truc") == 0) {
      // je voudrais utiliser ici mon object Truc
    } else if (o.getClass().getName().compareTo("Machin") == 0) {
      // je voudrai utiliser ici mon objet Machin
    } else if (o.getClass().getName().compareTo("Bidule") == 0) {
      // je voudrai utiliser ici mon objet Bidule
    }
    C'est bien beau, mais les méthodes d'un Truc, d'un Machin, ou d'un Bidule ne sont évidemment pas disponibles dans un Object. Ca doit probablement n'être qu'un détail, mais comment faire ?

    Merci

  2. #2
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Regarde du côté de la reflexivité.
    FAQ : reflexivité
    API Reflection
    Bonne chance.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  3. #3
    Membre actif Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 239
    Points
    239
    Par défaut
    si le nombre de classe est limité tu peux ecrire un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    if (o instanceof Truc) {
       Truc truc = (Truc) o;
    } else if (o instanceof Machin) {
        Machin machin = (Machin) o;
    } ....
    c'est peut etre moins élégant que la reflexivité mais cela apporte un avantage : une fois casté, l'objet est typé et donc les appels de méthodes n'utiliseront plus l'introspection qui est couteuse

    a toi de voir
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

  4. #4
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Une autre solution peut être le Wrapper, mais il nécessite que tu connaisses déjà tous les types d'objet susceptibles d'être envoyés.
    Deux champs : un int pour préciser le type de l'objet et une ArrayList pour éventuellement envoyer plusieurs objets en meme temps.
    Utilises des int en static final pour le type des objets et une structure switch- case.
    Ton client lit le Wrapper puis en fonction de la valeur du type, tu appeles la fonction correspondant en lui passant en argument l'ArrayList avec les objets.

    Pour le wrapper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Wrapper implements Serializable{
      public static final int TYPE1=1;
      public static final int TYPE2=2;
       ........
      private int typeObject;
      private ArrayList listObject;
     
      //Constructeur, getters et setters adequats ...
    Pour le client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ....
    Wrapper wrap= (Wrapper) tonObjectInputStream.readObject();
    switch(wrap.getTypeObject){
       case Wrapper.TYPE1: fonctionType1(wrap.getListObject);break;
       case Wrapper.TYPE2: fonctionType2(wrap.getListObject);break;
       ...
    }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/11/2011, 14h20
  2. Arbre composé d'objets de types différents
    Par Invité dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 12/04/2011, 18h14
  3. Réponses: 4
    Dernier message: 23/02/2010, 16h33
  4. itération sur des objets de types différents ?
    Par jc63 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/09/2007, 08h19
  5. Tableau d'objets de type différents
    Par Hell dans le forum C++
    Réponses: 9
    Dernier message: 11/01/2005, 22h57

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