.net 3.5 で NamedPipes を介してオブジェクトを送信する最良の方法を教えてください。
6 に答える
オブジェクトをテキストとして送信して反対側で逆シリアル化するよりも、 XmlSerializerでオブジェクトをシリアル化するか、Remusが提案するようにWCF名前付きパイプバインディングを使用します
WCF NetNamedPipes バインディングが最適な方法です。これを実現するために .NET Remoting を検討することもできます。
NetNamedPipeBindingで WCF を使用します。「名前付きパイプ バインディングを介して WCF サービスを公開する」も参照してください。
元の質問に対するコメントが指摘したように、他のプロセスにオブジェクトを送信することはありません。別のプロセスにデータを送信できます。そのデータを使用して、別のプロセスで元のオブジェクトのプロキシまたはファクシミリを作成できますが、オブジェクトを直接送信することはできません。
プロセス間オブジェクト受け渡しセマンティクスを提供するテクノロジーでさえ、内部的にはまさにそれを行っています。このため、「操作を実行してから実行しても問題がないことを確認する」スタイルではなく、「操作を実行して失敗した場合は例外をキャッチする」スタイルの操作を常に使用する必要があります。オブジェクトが操作に対して有効な状態にあるように見えても、古いデータを見ているため、実際の操作を実行しようとすると無効になる可能性があります。
したがって、オブジェクトを送信できないため、実際に行うことは、一部のデータをシリアル化し(XmlSerializer、DataContractSerializerなどを使用)、もう一方の端でデータストリームを読み取り、新しいオブジェクトを作成することです。古いものを表します。オブジェクトの実際のライブ表現とは対照的に、パイプを介して送信するデータを表す別のオブジェクトを作成する方が簡単な場合があります。
WCFは、これらの多くを自動的に処理できますが、パイプを介して自分で送信することはそれほど難しいことではありません。
他の人が示唆しているようにWCFを使用している場合は、まだ「オブジェクト」を送信していないことに注意してください。あなたはまだデータを送信しており、WCFはこれについてかなり明確です(これが、ObjectSerializerではなくDataContractSerializerと呼ばれる理由です)。具体的には:
1)DataContractシリアル化で送信されたオブジェクトに対して実行される操作はすべて、ローカルで実行されます。
2)同じオブジェクトが2回送信された場合、古いバージョンは自動的に更新されず、参照が等しくなりません。C#に関する限り、完全に無関係な2つのデータ構造があります。
3)オブジェクトの更新はローカルでのみ実行され、「同じ」オブジェクトで他のプロセスを自動的に更新することはありません。
プロセス間で「オブジェクト」を渡す必要があると絶対に確信している場合は、独自のオブジェクトをロールするか(より多くの作業が必要ですが、実際に推奨します)、System.Remoting名前空間を使用できます。
System.Remotingを使用している場合でも、上記で説明したのは実際に起こっていることであることに気づき、それを念頭に置いてオブジェクトとシステムを設計してください。より良い結果が得られます。
探しているのは DataContract 属性です。参照: MSDN Using Data Contracts .
データ コントラクトは、交換されるデータを抽象的に記述する、サービスとクライアントの間の正式な合意です。つまり、通信するために、クライアントとサービスは同じ型を共有する必要はなく、同じデータ コントラクトのみを共有する必要があります。データ コントラクトは、パラメーターまたは戻り値の型ごとに、どのデータをシリアル化 (XML に変換) して交換するかを正確に定義します。
サービス契約:
[ServiceContract]
public interface IApplicationRegistration
{
// Sends the application information
[OperationContract]
bool RegisterApplication(AppInfo appInfo);
}
交換するデータ:
[DataContract]
public class AppInfo
{
private int _processID;
private string _processName;
[DataMember]
public int ProcessID
{
get { return _processID; }
set { _processID = value; }
}
[DataMember]
public string ProcessName
{
get { return _processName; }
set { _processName= value; }
}
}
ここの非同期名前付きパイプ http://www.eggheadcafe.com/tutorials/aspnet/478ca475-2fd9-45d6-9090-5acdaeb00162/make-your-apps-talk-to-ea.aspx
私のコードの一部を使用します;-)