2010-07-09 6 views
2

J'ai toujours construit mes propres sérialiseurs/désérialiseurs pour pouvoir utiliser BeginReceive/EndReceive avec des sockets afin d'éviter d'utiliser un thread par socket connectée. C'est une tâche assez longue.Approche asynchrone pour utiliser des flux avec des sockets

J'ai commencé à regarder protobuf-net et je veux l'utiliser avec des sockets async sans avoir à écrire moi-même la sérialisation/désérialisation. Je préférerais ne pas avoir à utiliser un thread par socket pour boucler les opérations de blocage.

En regardant le quickstart, ils font exactement cela (un thread par client). N'y a-t-il pas d'autre moyen?

Ma question n'est pas vraiment sur protobuf-net, mais sur la sérialisation et les sockets en général. Mais les exemples pour protobuf-net sont les bienvenus.

Répondre

1

Ce n'est qu'un exemple de base. protobuf-net est la couche de sérialisation , pas la couche de messagerie. Si vous avez une manière spécifique de gérer la messagerie: allez-y. Tout ce que vous devez faire est, pendant le traitement de votre flux, mettre en mémoire tampon un message entier (peut-être dans un MemoryStream), puis le traiter via protobuf-net lorsque les données sont disponibles. La différence serait qu'au lieu d'utiliser directement les méthodes *WithLengthPrefix, vous pouvez gérer la longueur de la charge utile séparément, afin que votre code sache combien de données mettre en mémoire tampon avant le traitement.

+0

Les méthodes de sérialiseur/désérialiseur dans Serializer sont saisies, non? Je ne sais pas quel message protobuf je recevrai et je ne peux donc pas les utiliser, existe-t-il des alternatives? – jgauffin

+0

La réponse de Marc est correcte. Buffering à une "variante" longueur n'est pas facile, cependant. –

+0

@jgauffin - il existe un mécanisme via 'Serializer.NonGeneric' qui est conçu ** exactement ** pour cela, avec un mécanisme pour fournir le type à la volée. Il y avait une question récente avec un exemple de ceci ici sur SO. –

Questions connexes