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

C# Discussion :

[C# 2.0]Sérialization, Désérialisation,BinaryHeader


Sujet :

C#

  1. #1
    Membre confirmé Avatar de wizad
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 103
    Par défaut [C# 2.0]Sérialization, Désérialisation,BinaryHeader
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte[] readbuf = new byte[1024*1024]
    byte[] sendbuf;
    la classe Maison
    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
    [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):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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
    Je précise que le serveur traite les clients et les receptions de façon complètement asynchrone.

  2. #2
    Membre confirmé Avatar de wizad
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 103
    Par défaut
    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.

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

Discussions similaires

  1. [Tableaux] Variable sérializée dans un hidden ?
    Par guidav dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 11h08
  2. Réponses: 1
    Dernier message: 04/05/2006, 11h33
  3. [Persistence] Gestion de fichiers de sérialization
    Par narmataru dans le forum JDBC
    Réponses: 7
    Dernier message: 28/03/2006, 17h25
  4. Réponses: 4
    Dernier message: 19/02/2006, 17h59
  5. sérialisation désérialisation
    Par hug dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2006, 14h37

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