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 :

Serialization d'objet dans un ByteBuffer


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut Serialization d'objet dans un ByteBuffer
    Salut à tous,

    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 ?

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Peut-être en passant par des ByteArrayOutputStream / ByteArrayInputStream.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    Tu devrait utiliser un ObjectInputStream et ObjectOutPutStream comme flux de donner et tu connect ces flux à ceux de ta soket...

    Cela te permet de faire directement un readObject() et writeObject() sur ces flux puis de caster les objet reçu afin de recupere l'ensemble des objets que tu fais transiter sur le reseau

    ++

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par guis14
    Tu devrait utiliser un ObjectInputStream et ObjectOutPutStream comme flux de donner et tu connect ces flux à ceux de ta soket...

    Cela te permet de faire directement un readObject() et writeObject() sur ces flux puis de caster les objet reçu afin de recupere l'ensemble des objets que tu fais transiter sur le reseau

    ++
    En fait j'utilise justement les SocketChannel en mode non bloquant je peux donc pas utiliser le socket associé héhé...


    Merci y@m's, je vais jeter un oeil...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    J'ai beau regarder, je vois pas comment intégrer ces ByteArrayOutputStream / ByteArrayInputStream dans mon programme, la classe SocketChannel ne fournit aucune méthode pour obtenir des streams...

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Pour schématiser un peu ma pensé :

    Sérialisation ObjectOutputStream ByteArrayOutputStream byte[] ByteBuffer écriture dans SocketChannel

    Lecture depuis SocketChannel ByteBuffer byte[] ByteArrayInputStream ObjectInputStream désérialisation

    Après j'avoue ne pas très bien connaître le package nio , il y a peut-être plus simple.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Je vois ce que tu veux dire, je vois juste pas très bien les étapes :
    Sérialisation -> ObjectOutputStream
    et ObjectInputStream -> désérialisation

    En clair je vois pas comment obtenir un ObjectOutputStream à partir d'une de mes instance d'objet, et vice-versa...

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    C'était juste pour signalé que pour la sérialisation il faut utiliser un ObjectOutputStream et pour la désérialisation il faut un ObjectInputStream .

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    ben oui, mais je vois pas comment obtenir d'ObjectOutpuStream à partir de mon objet

  10. #10
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Tu n'obtient pas l'ObjectOutputStream à partir de ton objet mais a partir d'un OutPutStream que tu doit récupérer depuis ta Socket ou ta SocketChannel

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Hé bien à vrai dire c'est exactement ce que je voulais faire avant, avec un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Socket socket = socketChannel.socket();
    ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream());
    dos.writeObject(message);
    dos.close();
    mais ça ne marche absolument pas, parce que ma socketChannel est en mode non-bloquant, et je crois que le seul moyen d'écrire qqch dessus est d'utiliser la méthode SocketChannel.write(ByteBuffer).

    la classe SocketChannel ne fournit aucune méthode qui renvoie un stream quelconque. J'en déduit que le seul moyen que j'ai, c'est de fabriquer un objet ByteBuffer à partir de mon objet. Je crois vraiment que c'est possible, je trouve juste pas comment

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par ratakses
    J'en déduit que le seul moyen que j'ai, c'est de fabriquer un objet ByteBuffer à partir de mon objet. Je crois vraiment que c'est possible, je trouve juste pas comment
    Apparement tu n'as pas bien compris ce que je voulais dire (mais j'avoue ne pas avoir été très explicite).


    Tu as ton objet à sérialiser. La sérialisation se fait vers un flux ObjectOutputStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjectOutputStream out = ...;
    out.writeObject(monObjet);
    or tu veux un byte[].

    Pour ce faire il faut utilise un ByteArrayOutputStream sur lequel on mappe l'ObjectOutputStream dans lequel on sérialise l'objet. Une fois l'objet sérialisé, on récupère le byte[] via le ByteArrayOutputStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bos);
    out.writeObject();
    out.flush;
    byte[] data = bos.toByteArray();
    Tu as donc maintenant un byte[] contenant l'objet sérialisé, il ne te reste plus qu'à créer un ByteBuffer avec ce byte[] et l'envoyer dans le SocketChannel .

    En espérant avoir été plus clair.

    PS : attention, je ne gère aucune erreur dans ces exemples.

  13. #13
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    Je pense qu'il faut que tu creer ton objextOutputStream a partir de ton ByteArrayOutputStream que tu cré a partir de ton byte[] que tu creer a partir de ton byteBuffer qui vient de ta socketChannel que tu recupère avec client.read()...

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Ha la je vois beaucoup mieux, du coup !

    Merci pour ton aide, je vais essayer ça.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Cette méthode marche, merci bien y@m's !

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

Discussions similaires

  1. serialization d'objets dans un fichier
    Par badreddine540 dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 25/07/2007, 14h26
  2. acceder a un objet dans un CPropertySheet
    Par ludoviskm dans le forum MFC
    Réponses: 6
    Dernier message: 21/11/2004, 08h58
  3. [CR9] redimensionner un objet dans la section détail !
    Par LIM dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 27/04/2004, 18h19
  4. Mettre un objet dans un TListView
    Par FredericB dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/04/2004, 09h32
  5. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55

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