6
votes

Convertissez un objet à un tableau d'octets en C #, envoyez-le sur une prise, puis convertissez-la dans l'objet.

Donc, j'ai un serveur et un client qui communiquent diverses données et quatrième. Au départ, j'ai eu une méthode compliquée qui a traversé le tableau d'octets et convertit toutes ses variables et toutes ses cordes, une à une, dans ce qu'ils étaient censés être. J'ai appris que je pouvais mettre toutes les variables dans un objet et le convertir en une matrice d'octet à l'aide de xxx

et de le convertir en utilisant xxx p > Le problème est, une fois que j'envoie ce tableau d'octet sur le réseau à une autre application, je ne peux pas simplement utiliser cette méthode pour la convertir, je reçois l'erreur "Impossible de trouver Assemblage" Test1s, version = 1.0.0.0, culture = Neutre, PublickeyToken = null '. " Test1S n'est que le nom du petit programme que j'ai fait jouer avec cela. Évidemment, l'application nécessite des informations supplémentaires pour convertir ce tableau dans un objet, de même que je peux le faire, ou je vais du mal au problème?

Ce que je veux accomplir ici, c'est avoir Un objet de rien que plusieurs variables et chaînes, convertissez-la en une matrice d'octet, envoyez-la à une autre application et la reconvertissez-la dans l'objet. De cette façon, je n'ai pas à jouer avec le tableau d'octets pour extraire toutes mes variables et chaînes.

Merci


1 commentaires

Si j'étais vous, j'utiliserais un débogueur pour essayer de comprendre celui-ci. À moins que ce soit, c'est-à-dire que vous croyez qu'un débogueur est la mère de tout mal. Si vous ne savez pas ce que je veux dire, obtenez une charge de ceci: Stackoverflow.com/Questtions/602138/...


4 Réponses :


4
votes

Ceci fonctionnera si les deux côtés du canal de communication ont une référence à exactement le même assemblage et exactement la même version de cet assemblage , soit référencé du programme en quelque sorte ou vivre dans le GAC.

Si vous voulez un mécanisme plus tolérant des inadéquations de version, envisagez d'utiliser xmlSerializer à la place (mais noter que l'addition / les modifications des champs / propriétés peut entraîner un comportement incorrect si les versions ne correspondent pas à la version. ).

Si un format compact est requis, vous pouvez envisager d'envisager tampons de protocole Google . < / p>


0 commentaires

1
votes

Si vous envoyez une liste de chaînes (ou une dict de chaînes) est ce que vous voulez que ce n'est pas un problème, envoyez simplement une liste (ou dict) des chaînes. Votre problème vient parce que vous essayez d'envoyer un type de données que l'autre projet ne reconnaît pas. Vous n'avez même pas besoin de changer de vos fonctions, vous devez simplement modifier ce que vous envoyez. Sinon, vous pouvez faire référence à des tests1s du programme recevant les données.


0 commentaires

8
votes

Il existe une myriade de bibliothèques de sérialisation pré-laminées qui aideront ici. BinaryFormatter possède des fonctionnalités indésirables (IMO) indésirables, en particulier, elle ne fonctionnera que avec exactement la même dll (bien, à peu près) aux deux extrémités.

XMLSerializer, DatacontractSerializer et JavasCrriptsérializer sont de bonnes implémentations à base de texte et fonctionnent bien avec un contrat compatible aux deux extrémités (mêmes propriétés, etc. - pas nécessairement le même type / la même version).

Si vous avez des besoins modérés de bande passante, ou si vous avez besoin de meilleures performances de la CPU, je recommanderais ProTobuf-Net (CAVEAT: Je l'ai écrit) qui est un sérialisateur binaire rapide qui peut aider.


0 commentaires

0
votes

Écrivez votre propre objet de / à des octets convertisseur au lieu d'utiliser Bilarystream devrait fonctionner.

Si vous insistez, déplacez cet objet à son propre assemblage et ajoutez-le aux deux côtés comme référence. De cette manière, .NET Framework devrait pouvoir désexciter / sérialiser l'objet.


0 commentaires