cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009
-
29 avril 2007 à 17:17
mimosa803
Messages postés345Date d'inscriptionjeudi 15 février 2007StatutMembreDernière intervention24 avril 2010
-
7 avril 2009 à 22:02
Bonjour,
Dans la cadre de la réalisation d'un système client/serveur, je rencontre un problème lors de la désérialisation d'un classe maison.
general :
byte[] readbuf = new byte[1024*1024]
byte[] sendbuf;
la classe Maison
[Serializable]
public class NetworkPacket
{
private object cmd;
private ArrayList args;
public object Command
{
get { return cmd; }
}
public ArrayList Arguments
{
get { return args; }
}
public NetworkPacket(object command)
{
cmd = command;
args = new ArrayList();
}
public void Write(object obj)
{
args.Add(obj);
}
}
La sérialisation et l'envoi (coté client):
NetworkPacket np = new NetworkPacket("TEST");
np.Write("toto");
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, np);
this.sendbuf = ms.ToArray();
// on envois le tout.
this.sock.BeginSend(this.sendbuf, 0, this.sendbuf.Length, SocketFlags.None, new AsyncCallback(SendCallback), this.sock);
La désérialisation et la récéption (coté serveur) - readbuf étant le buffer de reception sur beginreceive:
MemoryStream memStream = new MemoryStream(this.readbuf);
memStream.Seek(0, SeekOrigin.Begin);
BinaryFormatter binForm = new BinaryFormatter();
NetworkPacket np = binForm.Deserialize(memStream) as NetworkPacket;
memStream.Close();
Avec ce système aucun problème quand un seul client est connecté je récupère bien mes networkpacket.
Par contre dés qu'un deuxème client arrive j'obtiens systématiquement ceci :
Exception: System.Runtime.Serialization.SerializationException
Le flux binaire '0' ne contient pas de BinaryHeader valide. Les raisons possibles sont un flux non valide ou une modification de la version de l'objet entre la sérialisation et la désérialisation.
à System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
à System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
à System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
à System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
à NetAccess.Server.ReceiveCallback(IAsyncResult ar) dans E:\NetAccess\NetAccess\Server.cs:ligne 125
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 29 avril 2007 à 18:12
Problème résolu : en fait j'utilisais le même buffer deux reception pour les différents clients ce qui fait qu'il se telescopait au niveau de la reception dans les thread séparé sur le même buff.