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] Pb de deserialisation


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut [serialization] Pb de deserialisation
    Bonjour à tous,

    Je rencontre un problème assez curieux : je suis entrain d'écrire une petite librairie réseau pour jeux type jeux de société. Celle-ci est basé sur l'échange de messages sous forme d'objets sérialisés.

    Afin d'être le plus clair possible, je vais vous décrire l'enchaînement complet :

    • un client A demande la création d'une partie
    • le serveur instancie la partie, et envoie à tous ses clients la liste des parties ouvertes, mise à jour avec la partie nouvellement créée par A. A chaque partie correspond un objet "NetGame", contenant notamment un tableau d'emplacements dans lesquels d'autres clients pourront s'inscrire. Le premier emplacement est occupé par le client qui a créé (ici A).
    • Chaque client va placer les objets "NetGame" issus de la liste envoyée dans des variables d'instances
    • un client B va alors demander au serveur son inscription à la partie. il envoie l'identifiant de celle-ci (un entier unique généré par le serveur à la création)
    • le serveur va alors placer le client B dans la partie (c'est à dire dans le deuxième emplacement), en modifiant l'objet correspondant, puis va renvoyer une nouvelle liste contenant les parties ouvertes
    • A la désérialisation sur les clients, l'objet "NetGame" est inchangé. En particulier, on s'aperçoit dans le débugger d'eclipse que l'id de l'objet "NetGame" désérialisé est le même que celui préalablement placé dans les variables d'instance du client. Du coup le deuxième emplacement de la partie est vide.


    Ce qui est assez étonnant, c'est qu'en plaçant un point d'arrêt sur le serveur à la ligne "out.writeObject(message)", et un point d'arrêt sur la ligne suivant "Object message = in.readObject()" sur le client, le contenu de message n'est pas le même à l'émission et à la réception : les données du message reçu sont indentiques à celles des variables d'instance du client.

    J'ai recherché un peu sur le net, mais je n'ai pas trouvé grand-chose ; à priori c'est un problème d'écrasement mais je ne vois pas la raison. Le problème étant assez difficile à expliquer, n'hésitez pas à demander des précisions.

    Merci d'avance de vos réponses !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    On pourrait voir un peu à quoi ressemble ta classe NetGame ? En particulier comment sont déclaré ses champs et si tu utilises un méthode particulière de sérialisation...

    a++

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    ton probleme est bizarre ...
    j'utilise une classe de ce genre :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    package com.daedric.dmess.message;
     
    import java.io.Serializable;
     
    import javax.swing.ImageIcon;
     
    import com.daedric.swing.text.TextStylizer;
     
    public class Message implements Requestable, Serializable {
     
    	private static final long	serialVersionUID	= -1061459363120194710L;
    	private TextStylizer		doc					= null;
    	private ImageIcon[]			img					= null;
    	private String				dest				= null;
    	private String				emetteur			= null;
    	private MessageType			type				= null;
    	private MessengerAction		mac					= null;
    	private Object				arg					= null;
     
    	public <T extends Serializable> Message(MessageType t, MessengerAction ac,
    			T arg, String emetteur) {
     
    		this(t, ac, arg, null, emetteur, null, new ImageIcon[0]);
    	}
     
    	public <T extends Serializable, K extends TextStylizer> Message(
    			MessageType t, String dest, String emetteur, K doc,
    			ImageIcon... img) {
    		this(t, null, null, dest, emetteur, doc, img);
    	}
     
    	public <T extends Serializable, K extends TextStylizer> Message(
    			MessageType t, MessengerAction ac, T arg, String dest,
    			String emetteur, K doc, ImageIcon... img) {
    		this.dest = dest;
    		this.arg = arg;
    		this.emetteur = emetteur;
    		this.doc = doc;
    		this.img = img;
    		this.type = t;
    		this.mac = ac;
    		if (this.type == null || this.emetteur == null)
    			throw new NullPointerException("arguments null : type ="
    					+ this.type + "\nemetteur =" + this.emetteur);
    	}
     
    	public TextStylizer getDoc() {
    		return doc;
    	}
     
    	public ImageIcon[] getImg() {
    		return img;
    	}
     
    	public String getDest() {
    		return dest;
    	}
     
    	public String getEmetteur() {
    		return emetteur;
    	}
     
    	public MessageType getMessageType() {
    		return type;
    	}
     
    	public <T extends Serializable> T getArg() {
    		return (T) arg;
    	}
     
    	public MessengerAction getMessageAction() {
    		return mac;
    	}
     
    	public String toString() {
    		return "emetteur = " + this.getEmetteur() + "\ndestinataire = "
    				+ this.getDest() + "\nMessageType = " + this.getMessageType()
    				+ "\nMessageAction = " + this.getMessageAction() + "\narg = "
    				+ this.getArg();
    	}
    }
    pour une application de chat avance genre msn (loins d'etre fini) et je n'ai aucun probleme ... les donnees ne sont pas alteres

    je pense que tu dois avoir des problemes de reference ou un truc a la con comme ca mais qui sont chiant a detecter

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    Voici le code de la classe NetGame :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    package org.game_net;
     
    import java.io.Serializable;
    import java.util.Vector;
     
    public final class NetGame implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	private class Emp implements Serializable {
     
    		private static final long serialVersionUID = 1L;
     
    		private NetPlayer np;
    		private boolean closed = false;
     
    		public boolean available() {
    			return ! closed && np == null;
    		}
     
    		public void close() {
    			release();
    			closed = true;
    		}
     
    		public void open() {
    			closed = false;
    		}
     
    		public void setPlayer(NetPlayer np) {
    			this.np = np;
    		}
     
    		public void release() {
    			np = null;
    		}
     
    		public int status() {
    			if (closed)
    				return -1;
    			else if (np == null)
    				return 0;
    			else
    				return 1;
    		}
     
    		public String toString() {
    			switch(status()) {
    			case 0:
    				return "-";
    			case 1:
    				return np.getName();
    			default:
    				return "x";
    			}
    		}
    	}
     
    	private Emp[] emps;
    	private static int last_net_id = 0;
    	private int net_id;
    	private String name;
     
    	public NetGame(int nb_emp) {
    		emps = new Emp[nb_emp];
    		for (int i=0; i<nb_emp; i++)
    			emps[i] = new Emp();
    		net_id = last_net_id++;
    	}
     
    	public int getNet_id() {
    		return net_id;
    	}
     
    	public synchronized void openEmp(int n) {
    		if ( n>0 && n<emps.length)
    			emps[n].open();
    	}
     
    	public synchronized void closeEmp(int n) {
    		if ( n>0 && n<emps.length)
    			emps[n].close();
    	}
     
    	public synchronized void setPlayer(int n, NetPlayer np) {
    		if ( n>0 && n<emps.length && emps[n].available() )
    			emps[n].setPlayer(np);
    	}
     
    	public synchronized void release(int n) {
    		if ( n>0 && n<emps.length)
    			emps[n].release();
    	}
     
    	public synchronized boolean add_player(NetPlayer pl) {
    		for (int i=0; i<emps.length; i++) {
    			if (emps[i].available()) {
    				emps[i].setPlayer(pl);
    				return true;
    			}
    		}
    		return false;
    	}
     
    	public synchronized int remove_player(NetPlayer pl) {
    		for (int i=0; i<emps.length; i++) {
    			if (emps[i].np != null && emps[i].np.equals(pl)) {
    				emps[i].release();
    				if ( i==0 ) {
    					while (i<emps.length && emps[i].status() != 1) i++;
     
    					if ( i == emps.length )
    						return -1;
     
    					emps[0] = emps[i];
    					emps[i] = new Emp();
    				}
    				return 0;
    			}
    		}
    		return 1;
    	}
     
    	public boolean isOwner(NetPlayer pl) {
    		if ( emps[0].np != null )
    			return emps[0].np.equals(pl);
    		return false;
    	}
     
    	public boolean isPlayer(NetPlayer pl) {
    		for (Emp e : emps)
    			if (e.np != null && e.np.equals(pl))
    				return true;
     
    		return false;
     
    	}
     
    	public NetPlayer[] getPlayers() {
    		Vector<NetPlayer> pls = new Vector<NetPlayer>();
    		for (Emp e : emps) {
    			if ( ! e.closed && e.np != null )
    				pls.add(e.np);
    		}
    		NetPlayer[] ret = new NetPlayer[pls.size()];
    		int i=0;
    		for (NetPlayer p : pls)
    			ret[i++] = p;
    		return ret;
    	}
     
    	public boolean equals(Object o) {
    		if ( ! (o instanceof NetGame))
    			return false;
     
    		return ((NetGame)o).net_id == net_id;
    	}
     
    	public String toString() {
    		StringBuffer sb = new StringBuffer();
    		if ( name != null && name.length() > 0)
    			sb.append(name+" ");
    		sb.append('[');
    		for (Emp e : emps) {
    			sb.append(e);
    			sb.append(',');
    		}
    		sb.deleteCharAt(sb.length()-1);
    		sb.append(']');
    		return sb.toString();
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    Je pense également que c'est un problème de référence. Au moment de la désérialisation, java doit repérer l'ancienne référence et choisit de ne pas l'écraser ... Je vais essayer de cloner les objets avant de les envoyer, pour voir si cela résout le problème.

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    peux tu mettre les morceaux de codes pour l'envois et la reception des objet serialisé

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    Finalement, en clonant les objets avant de les envoyer dans le flux, le problème n'est plus apparu. Merci pour vos réponses en tout cas !

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

Discussions similaires

  1. serialization / deserialisation d'un Enum
    Par olibara dans le forum C#
    Réponses: 6
    Dernier message: 06/07/2012, 12h05
  2. Serialization et Deserialisation d'un JComponent
    Par Peps0u dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 06/12/2010, 20h08
  3. type serial : pb
    Par xopos dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/09/2004, 09h08
  4. [DB2 V7 & V8] equivalent du type SERIAL
    Par geoffrey_k dans le forum DB2
    Réponses: 3
    Dernier message: 05/07/2004, 14h09
  5. Problème de serialization
    Par bruno270579 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 30/04/2003, 18h11

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