11
votes

Comment envoyer un objet via Namedpipe in .NET 3.5?

Pouvez-vous me dire quelle est la meilleure façon d'envoyer des objets via NamedpiPes in .NET 3.5?


3 commentaires

Voici un POST utile . Pour envoyer des objets via des flux, lisez d'abord sur ce ici et ici .


Vous n'envoyez pas d'objets via des communications intra-processus, vous envoyez des représentations d'entre elles, textuelles ou binaires. Ceux-ci sont ensuite utilisés pour recréer l'objet de l'autre côté


Consultez ma réponse mise à jour pour un lien qui explique des objets sérialisés aux flux.


6 Réponses :



3
votes

Serialize Votre objet par xmlSerializer que Envoyez-la sous forme de texte et de désériorize de l'autre côté, ou utilisez WCF nommé des tuyaux nommés lorsque Remus suggère


2 commentaires

Pourquoi utiliser la sérialisation XML si vous utilisez WCF? Pourquoi ne pas utiliser le sérialisateur de contrat de données, qui permettra à l'objet d'être envoyé à Binrary?


Je suggère d'utiliser xmlSerializer s'il ne veut pas utiliser WCF, oui, il peut également utiliser le sérialisateur de contrat de données aussi



1
votes

Ce que vous cherchez est l'attribut Datacontract. Voir aussi: MSDN à l'aide de contrats de données .

Un contrat de données est un accord formel entre un service et un client qui décrit abstraitement les données à échanger. C'est-à-dire que, pour communiquer, le client et le service n'ont pas à partager les mêmes types, seuls les mêmes contrats de données. Un contrat de données définit précisément, pour chaque paramètre ou type de retour, quelles données sont sérialisées (transformées en XML) à échanger.

Votre contrat de service: xxx

Les données à échanger: xxx


0 commentaires

3
votes

La liaison WCF NetNamedpiPes est la voie à suivre, vous pourriez également envisager de vous remettre pour atteindre ce


0 commentaires

1
votes

Comme un commentaire sur la question initiale a souligné, vous n'envoyez pas d'objets à d'autres processus. Vous pouvez envoyer des données à un autre processus et que les données peuvent être utilisées pour créer un proxy ou un télécopieur de l'objet d'origine dans l'autre processus, mais vous ne pouvez pas envoyer directement d'un objet . .

Même les technologies qui offrent une sémantique inter-processus qui passe d'objet sont, sous la cagoule, exactement cela. Pour cette raison, vous devez toujours utiliser l'essai «Essayez d'effectuer une opération et de saisir l'exception s'il échoue de style d'opérations plutôt que de« s'assurer que tout va bien de faire le fonctionnement, puis de le réaliser. Même si l'objet ressemble à celui-ci est dans un état valide pour votre opération, vous regardez d'anciennes données, ce qui peut donc ne pas être valide lorsque vous essayez d'effectuer l'opération réelle.

Donc, puisque vous ne pouvez pas envoyer d'objets, ce que vous allez vraiment finir de faire est de sérialiser certaines données (à l'aide de XMLSerializer ou de DatacontractSerializer, ou autre), lisant le flux de données à l'autre extrémité et créez un nouvel objet pour représenter l'ancien. Vous trouverez peut-être plus facile de créer un objet distinct pour représenter les données que vous souhaitez envoyer sur le tuyau, par opposition à la représentation réelle et en direct de l'objet.

WCF peut gérer beaucoup de ce genre de choses pour vous, mais il n'y a rien de trop difficile de l'envoyer sur un tuyau vous-même.

Si vous utilisez WCF, car d'autres ont suggéré, sachez que vous n'envoyez toujours pas des "objets". Vous envoyez toujours des données et WCF est assez explicite à ce sujet (c'est pourquoi ils l'appellent un DatacontractSérialiseur et non un objectorialiste). Plus précisément:

1) Toutes les opérations effectuées sur un objet envoyé avec la sérialisation de Datacontract seront effectuées localement.

2) Si le même objet est envoyé deux fois, il ne mettra pas automatiquement à jour les anciennes versions de celui-ci et n'aura pas d'égalité de référence. Vous aurez deux structures de données qui, en ce qui concerne C # concernent, sont entièrement non liées.

3) Les mises à jour d'un objet ne seront effectuées localement et ne mettront pas automatiquement à jour les autres processus avec le "même" objet.

Si vous êtes absolument convaincu que vous devez passer des "objets" sur des processus, vous pouvez rouler le vôtre (que je recommanderais réellement, même si c'est plus de travail) ou utilisez l'espace de noms System.Remoting. < / p>

Même si vous utilisez System.Remoting, réalisez que ce que j'ai parlé ci-dessus est ce qui est effectivement et concevez vos objets et votre système avec cela à l'esprit. Vous obtiendrez beaucoup de meilleurs résultats.


0 commentaires

0
votes