Sérialization, BinaryHeader

Résolu
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009 - 29 avril 2007 à 17:17
mimosa803 Messages postés 345 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 24 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

3 réponses

cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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.
3
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
29 avril 2007 à 17:31
je précise que le serveur traite les clients et receptions de façon complètements asynchrone.
0
mimosa803 Messages postés 345 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 24 avril 2010
7 avril 2009 à 22:02
Bonsoir, j'ai rencontré le même problème que vous, je souhaite savoir qu'est ce que vous avez fait ?
0
Rejoignez-nous