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

Entrée/Sortie Java Discussion :

SocketChannel et Sérialisation


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 191
    Par défaut SocketChannel et Sérialisation
    Bonjour à tous,

    Ca fait une journée que je butte sur un problème. J'ai un client qui se connecte à un serveur et qui lui envoit un objet sérialisé. Seulement pour une question de performance je dois utilisé les channels.

    Voici le code de mon client:

    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
     
    bos = new ByteArrayOutputStream();
    oos = new ObjectOutputStream(bos);
    oos.writeObject(MonMessage);
    oos.flush();
     
    byte[] data = bos.toByteArray();
    ByteBuffer bufferObject = ByteBuffer.wrap(data);                  
     
    ByteBuffer bufferSize = ByteBuffer.allocateDirect(4);
    bufferSize.putInt(bufferObject.capacity());
    bufferSize.flip();
     
    socketChannel.write(bufferSize);
    socketChannel.write(bufferObject);
    J'écris donc un première fois la taille de mon objet puis j'écris l'objet sérialisé. Cette partie de code ne semble pas poser de problème. Voici le code côté serveur:

    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
     
    ByteBuffer bufferSize = ByteBuffer.allocateDirect(4);
    int lg1 = socketChannel.read(bufferSize);
    bufferSize.flip();
     
    int size = bufferSize.getInt();
     
    ByteBuffer bufferObject = ByteBuffer.allocateDirect(size);
    int lg2 = socketChannel.read(bufferObject);
    bufferObject.flip();
     
    byte data[] = bufferObject.array();   //Exception java.lang.UnsupportedOperationException
     
    bis = new ByteArrayInputStream(data);
    ois = new ObjectInputStream(bis);
     
    mes = (MonMessage)ois.readObject();
    Je lis donc mes 2 ByteBuffer sans aucun problème mais au moment de l'appel de la méthode array() de mon bufferObject je me tappe l'exception UnsupportedOperationException. Je ne comprends vraiment pas...

    Avez-vous une idée ?

    Merci d'avance...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Par défaut
    Salut à toi,

    J'ai trouvé ça:

    ici et encore

    - le 1er sur la Serialization d'objet dans un ByteBuffer
    J'ai des objets de type Message (Serializable), et je cherche à les serializer/déserializer dans des ByteBuffer afin de les envoyer au travers de SocketChannel... Est-ce que qqn sait comment procéder ?
    - le 2eme sur [nio] Transfert non bloquants d'objets par SocketChannel
    je suis à la recherche d'un bout de code qui montre comment transférer des objets en utilisant les NIO (E/S hautes perfs.)
    J'espère que celà pourra t'aider

    Amicalement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 191
    Par défaut
    Je ne comprends vraiment pas. J'ai trouvé une alternative qui est de remplir moi même le byte[] de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    byte[] data = new byte[bufferObject.capacity()];
     
    for (int i = 0; i < data.length; i ++) {
     
          data[i] = bufferObject.get();
    }
    Ca marche parfaitement mais je ne comprends toujours pas pourquoi la méthode array() de la classe ByteBuffer me revoit cette exception.

    Si qq'un a une idée...je suis preneur

    Merci

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    extraits de la javadoc :
    Invoke the hasArray method before invoking this method in order to ensure that this buffer has an accessible backing array
    ...
    UnsupportedOperationException - If this buffer is not backed by an accessible array
    Je ne vois pas cette recommandation appliquée dans ton code

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 191
    Par défaut
    Honte sur moi. Cool un grand merci !!!

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

Discussions similaires

  1. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28
  2. [Sérialisation] StackOverFlowError levée
    Par ptitjack dans le forum Général Java
    Réponses: 9
    Dernier message: 04/11/2004, 13h27
  3. [Serializable][image] Sérialiser une image
    Par Galima dans le forum Graphisme
    Réponses: 7
    Dernier message: 01/07/2004, 18h12
  4. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24
  5. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18

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