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 :

Sérialisation, Vector et Socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut Sérialisation, Vector et Socket
    Bonjour,

    J'ai une architecture client/serveur par sockets. Pour transférer les informations entre le client et le serveur, j'utilise :
    • La sérialsiation des objets
    • ObjectInputStream et ObjectOutputStream pour émettre et récupérer


    J'ai trois classes imbriquées
    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
    public class uTraining implements Serializable
    {
    	private Vector			_sessions; // Vecteur de uTrainingSession
    	...
    }
     
    public class uTrainingSession implements Serializable
    {
    	private Vector		_days; // Vecteur de uTrainingDays
    	...
    }
     
    public class uTrainingDay implements Serializable
    {
    	private Vector		_idTrainers; // Vector de String
    	...
    }
    Je transmets depuis le client un objet de type uTraining deux fois en ayant modifié le contenu du Vector _idTrainers entre les deux transferts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uTraining myTraining = ...
    myObjectOutPutStream.writeObject(myTraining);
     
    // modification du contenu de _idTrainers, par exemple plus qu'un seul objet dans le Vector contre 2 précédemment.
    ...
     
    // Transfert à nouveau de myTraining
    myObjectOutPutStream.writeObject(myTraining);
    Et voilà mon problème :
    Côté serveur, le contenu de _idTrainers n'a pas changé ! (l'adresse de l'objet est le même d'après ce que j'ai constaté avec le debuggueur d'Eclipse)
    J'ai bien vérifié côté client juste avant writeObject, il n'y a qu'un seul objet dans le Vector avant le 2ème envoi.

    Merci d'avance pour votre aide

  2. #2
    Membre expérimenté Avatar de Betatesteur
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut
    Hello,

    Il n'est conseillé d'employer Vector

    @++

  3. #3
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    Betatesteur,
    Pas conseillé : quels sont les problèmes potentiels ? Que faut-il utiliser à la place sachant que j'ai le JDK 1.4.2 ? ArrayList ?

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par willowII
    ArrayList ?
    Oui, ArrayList...

    Vector -> ArrayList
    Hashtable -> HashMap
    Stack -> LinkedList
    Enumeration -> Iterator

  5. #5
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    J'étais un peu dubitatif que de passer de Vector à ArrayList puisse régler mon problème mais j'en quand même essayé : toujouts pareil

  6. #6
    Membre expérimenté Avatar de Betatesteur
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut
    Citation Envoyé par willowII
    J'étais un peu dubitatif que de passer de Vector à ArrayList puisse régler mon problème mais j'en quand même essayé : toujouts pareil
    On a jamais dit que ça allait resoudre ton problème

    fais voir ton code entier.
    t'as quoi comme message d'erreur? warning?
    fais voir

    @++

  7. #7
    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
    Attention tout de même au passage de Vector à ArrayList dans le cadre d'un serveur multithreadé. ArrayList n'est pas safe-Thread et une utilisation classique peut amener à des problèmes de synchronisation.
    Pour réobtenir la synchronisation, il faut déclarer la liste comme ça ( issu de la javadoc ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List list = Collections.synchronizedList(new ArrayList(...));

  8. #8
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    Betatesteur,
    Le code entier cela ne va pas être évident (cf nombre de fichiers et de lignes)
    Pour ce qui est de l'erreur ou du warning, je n'en ai pas. C'est juste que lors du traitement j'ai deux objets dans ma liste au lieu d'un et que du coup je ne stocke pas les bonnes informations dans la base

    iohack,
    Merci, j'avais vu cela dans la doc mais je n'ai pas ce genre de problèmes sur les vecteur smodifiés. (je ne suis pas près de changer tous mes vectors, il y en a trop !)

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par willowII
    iohack,
    Merci, j'avais vu cela dans la doc mais je n'ai pas ce genre de problèmes sur les vecteur smodifiés. (je ne suis pas près de changer tous mes vectors, il y en a trop !)
    Tu as juste à faire Remplacer tout... "Vector" -> "ArrayList"
    (dans quasiment tous les cas, ça suffit)

  10. #10
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    J'ai peut-être quelque chose d'intéressant pour progresser :
    J'ai implémenter la méthode sur mes trois classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException
    {
    ObjectInputStream.GetField fields = stream.readFields();
    // Décodage des champs
    ...
    }
    côté serveur pour gérer moi-même la désérialisation de l'objet.
    Lors du premier transfert, je passe dans l'ordre :
    1 - uTraining::readObject
    2 - L'appel à stream.readFields() depuis uTraining provoque l'appel à uTrainingSession::readObject
    3 - L'appel à stream.readFields() depuis uTrainingSession provoque l'appel à uTrainingDay::readObject
    puis décodages des valeurs des champs pour chaque classe

    Lors du deuxième transfert, je passe dans l'ordre
    1 - uTraining::readObject
    2 - L'appel à stream.readFields() depuis uTraining (mais qui ne déclenche pas l'appel à uTrainingSession::readObject)
    3 - Décodage des champs de uTraining
    Je ne passe ni dans uTrainingSession::readObject, ni dans uTrainingDay::readObject

    Du coup, il n'est qu'à moitié surprenant que l'objet ne change pas !

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    C'est pas un problème de cache?

  12. #12
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Par défaut
    Citation Envoyé par ®om
    C'est pas un problème de cache?
    Je ne savais pas qu'il pouvait y avoir un cache. Peux-tu développer un peu ?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Par défaut
    up,

    c'est en faisant une recherche que je suis tombé sur cette discussion, et je me permets de la relancer car j'ai actuellement le même problème.

    J'ai un jeu de carte en réseau client - serveur qui utilise des sockets. Pour transférer les informations entre le client et le serveur, j'utilise également des objets sérialisés que j'envoie sur un ObjectOutputStream et que je reçoit sur un ObjectInputStream.

    Mes objets échangés sont variés, et j'ai ce problème avec ma classe DeckOfCards, qui représente le tas de cartes à jouer pour un tour, et qui hérite de ArrayList. Lorsque j'envoie le premier DeckOfCard, du serveur aux clients, pas de problème, ils le reçoivent tous sans problème. Je redistribue les cartes côtés serveur pour le deuxième tour et mes objets DeckOfCard côté client ne changent plus, ils conservent les valeurs reçut au premier envoie. Quelqu'un a une idée ?

    merci pour votre aide, Bat.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uTraining myTraining = ...
    myObjectOutPutStream.writeObject(myTraining);
     
    // modification du contenu de _idTrainers, par exemple plus qu'un seul objet dans le Vector contre 2 précédemment.
    ...
     
    // Transfert à nouveau de myTraining
    myObjectOutPutStream.writeObject(myTraining);
    Il faut recréer un ObjectOutputStream entre les deux write, sinon lors du 2e write il voit que l'objet a déjà été écrit. Dans ce cas il n'écrit que la référence sur l'objet et pas l'objet entier, d'où le problème (pareil pour bapt)

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Par défaut
    ça ne m'arrange pas du tout ça. J'envois des données sur les ObjectStream constamment, et pour recréer l'ObjectOutputStream sur le server il faut également le faire côté client, ce qui est pratiquement impossible.

    Il n'y a pas une autre solution ?

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Envoyer un nouvel objet (new ...(...))
    Il y a aussi la méthode reset() sur un ObjectOutputStream

  17. #17
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    Citation Envoyé par iohack
    Attention tout de même au passage de Vector à ArrayList dans le cadre d'un serveur multithreadé. ArrayList n'est pas safe-Thread et une utilisation classique peut amener à des problèmes de synchronisation.
    Pour réobtenir la synchronisation, il faut déclarer la liste comme ça ( issu de la javadoc ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List list = Collections.synchronizedList(new ArrayList(...));
    iohack a raison je pense que la liste des valeurs envoyées n'est pas synchronisée alors qu'elle est surement bloquée à la deuxième modif. Et puis surement que l'objet envoyé est détruit ou déréférencé à sa sérialisation.
    Je conseillerais de contourner le problème en clonant l'objet avant de le mettre dans la socket!

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Par défaut
    dsl, fausse manip

  19. #19
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Par défaut
    un reset de l'ObjectOutputStream après chaque envois semble être la bonne solution !

    Merci !

  20. #20
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    plus simple: les object Stream mémorisent les objets qui passent
    donc renvoyer le même objet modifié ne marche pas
    tu peux faire reset
    mais tu peux faire writeUnshared et à ce moment tu auras bien deux objets
    de l'autre coté!!!

Discussions similaires

  1. sérialiser la class socket
    Par k9999xx dans le forum C#
    Réponses: 4
    Dernier message: 02/07/2014, 18h26
  2. Sérialiser une socket
    Par sagopa dans le forum C++
    Réponses: 2
    Dernier message: 30/09/2008, 12h22
  3. [POO] Sérialiser Objet PHP avec Socket
    Par Invité4 dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2007, 11h37
  4. Réponses: 3
    Dernier message: 20/10/2006, 19h50
  5. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24

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