La sérialisation d'objet prêt à envoyer plus de TCPClient Flux
J'ai un serveur et un client configuré à l'aide de TcpListener
et TcpClient
.
Je veux envoyer un objet à mon application serveur pour traitement.
J'ai découvert la using System.Runtime.Serialization
et suivants la documentation, mais je ne voulais pas faff autour pour trouver ce que je suis en train de faire de longue haleine.
La question: Quelle est la meilleure manière de traiter et d'envoyer un objet dans le flux TCP?
L'envoi et la réception.
Voici un exemple de mon objet:
//Create a new house to send
house newHouse = new house();
//Set variables
newHouse.street = "Mill Lane";
newHouse.postcode = "LO1 BT5";
newHouse.house_number = 11;
newHouse.house_id = 1;
newHouse.house_town = "London";
OriginalL'auteur Luke | 2011-10-21
Vous devez vous connecter pour publier un commentaire.
En supposant que vous avez une classe
House
(disponible sur les deux côtés de votre connexion) qui ressemble à ceci:Vous pouvez sérialiser la classe dans une
MemoryStream
. Vous pouvez ensuite utiliser dans votreTcpClient
connexion comme ceci:Bien sûr, vous avez à faire un peu plus d'enquête afin de faire le programme en cours d'exécution, sans exception. (par exemple, Vérifier
memoryStream.Length
pas être plus grand qu'un int, un.s.o.), mais j'espère que je vous ai donné le droit des suggestions pour vous aider sur votre chemin 😉Merci pour votre conseil, j'ai changé l'échantillon dans cette voie!
OriginalL'auteur Fischermaen
Votre réponse, cela implique l'objet suivant (il est courant de nommer les classes à l'aide de chameau cas):
Maintenant, vous pouvez sérialiser vos objets:
OriginalL'auteur PVitt
Vous pouvez tout simplement décorer votre
House
de classe avec le[Serializable]
attribut. (Vous n'avez pas besoin de définir tous les autres trucs que posté dans l'autre réponse)Vous pouvez ensuite envoyer cet objet sur le fil par sérialisation à l'aide de la
BinaryFormatter
classe.Avez-vous envisagé de mettre en place un service WCF au lieu d'utiliser TcpListener et TcpClient ? Rend la vie beaucoup plus facile.
Par exemple, vous pourriez définir un service qui a retourné une maison
Voir cette l'exemple du monde réel.
OriginalL'auteur wal
Comment feriez-vous pour désérialiser le xml Maison de flux de rentrer dans une Maison d'objet sur la fin de réception?
Je suis en se référant à la solution donnée dans Fischermaen de réponse.
Sur mon recieving je peux voir une représentation de chaîne dans ma fenêtre de Sortie en utilisant les éléments suivants:
Vous en remercie d'avance.
MODIFIER *
Ok bien cette solution a fonctionné pour moi. Il faudrait peut-être faire du rangement.
Voici une méthode pour désérialiser une chaîne de caractères:
Puis, à partir de mon TPC/IP Recevoir de fin, j'ai appeler la méthode comme suit:
OriginalL'auteur RobHurd
D'abord créer un vide ServerApplication et ClientApplication que l'Application de la Console afin de simplifier l'exemple.
Ensuite, mettre la définition de la sérialisation d'un objet dans un ensemble distinct et ensuite d'ajouter une référence à l'assembly partagé à chaque projet (client et serveur). Est nécessaire de partager le même objet, pas seulement un cours identique copie.
Pour Générer DLL >
Clic droit dans Solution "ServerApplication' dans l'Explorateur de solutions > Ajouter un Nouveau Projet... -> sélectionnez la Bibliothèque de classes
(par exemple, le nom de ce projet MySharedHouse)
Renommez le Class1 par défaut pour la Maison et de le compléter
Clic droit dans MySharedHouse et Construire.
Maintenant la dll est en construction et nous avons besoin de l'ajouter dans le Projet de Serveur et de Client du Projet.
Clic droit dans ServerApplication > Ajouter une Référence > Parcourir et de trouver la dll, pour cet exemple
Répétez le processus de l'ClientApplication à l'aide de la même dll (même chemin).
Maintenant, vous pouvez utiliser des instances de la classe de Maison en ServerApplication et ClientApplication comme un seul objet, il suffit d'ajouter la phrase "à l'aide de MySharedHouse" en haut.
CODE SERVEUR
CODE CLIENT
Wooala! la première maison à être envoyés sur TCP/IP
OriginalL'auteur Musculaa