1

Je souhaite sérialiser un objet et l'envoyer sur le réseau. Je l'ai mis en place en utilisant ISerializeable attribut sur ma classe et BinaryFormatter pour convertir l'objet en octets. Je peux envoyer l'objet et le désérialiser à la réception. Cependant, afin d'assurer que j'ai l'objet entier avant d'essayer de le reconstruire, je veux envoyer la taille avec le flux. Je voudrais définir les premiers octets comme la taille, vérifier quand les données reçues sont au moins cette taille fixe, alors je peux lire cela et obtenir la taille complète de l'objet. Ensuite, il s'agit simplement d'attendre que mes données reçues soient de la taille de l'objet + les octets de taille fixe. Comment puis-je compenser mes données dans mon flux afin que je puisse envoyer un int pour stocker la taille de l'objet comme les premiers octets, et mon objet comme les octets restants?C# Envoi de la taille de l'objet avec l'objet sérialisé sur la connexion du socket asynchrone

+0

O s'il vous plaît. Avec votre question précédente (maintenant supprimée) nous venons d'établir que ce n'était pas la (de) sérialisation mais l'E/S. –

+0

J'envoie les données et ferme le flux. Je lis ensuite de l'octet de flux par octet. À tout moment dans le flux, la longueur est toujours un octet. J'ai besoin d'être capable d'envoyer la longueur pour savoir combien de temps le flux est et pour s'assurer que je reçois seulement un objet, et pas des parties d'un autre. –

+0

Si votre E/S est correcte, le formateur prendra soin de la longueur (s) –

Répondre

1

La bonne réponse est:

SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
socketData.currentSocket.EndReceive(asyn); 
byte[] data = socketData.dataBuffer; 

Est pas la bonne façon de lire à partir d'un SocketPacket

+0

Comment dois-je lire à partir d'un SocketPacket alors? –

1

Qu'essayez-vous exactement d'empêcher? TCP intègre déjà des contrôles de cohérence et de fiabilité.

+0

Mes pensées aussi ... Sauf si OP envoie un UDP mais vous ne le feriez pas si la fiabilité importait. –

+0

Je veux m'assurer que toutes les données sont reçues avant de créer mon objet. Depuis que je lis l'octet de données par octet, et je ne sais pas si toutes les données ont été reçues sans une taille définie. –

+0

@Chris: Dans ce cas, les caractères de fin sont beaucoup plus faciles. –

1
MemoryStream resultStream = new MemoryStream(); 
resultStream.Write(BitConverter.GetBytes(objectStream.Length)); 
resultStream.Write(objectStream.ToArray()); 

// send the resultStream 
1

Pouvez-vous sérialisation à un MemoryStream, puis une fois cela fait ajouter le .Length du MemoryStream, suivi par les données (utiliser GetBuffer() et copier .Length octets du tableau). Inverser au récepteur; lire la longueur (généralement 4 octets), puis emballer autant de données dans un MemoeryStream; rembobiner le MemoryStream (Position=0) et le désérialiser. Bien sûr, vous devez accepter boutisme etc.

(voir, et je ne parle même prot ... oh, cette autre chose)

Questions connexes