你能告诉我在 .NET 3.5 中通过命名管道发送对象的最佳方法是什么吗?
你能告诉我在 .NET 3.5 中通过命名管道发送对象的最佳方法是什么吗?
使用XmlSerializer将对象序列化,然后将其作为文本发送并在另一端进行反序列化,或者像Remus建议的那样使用WCF命名管道绑定。
WCF NetNamedPipes绑定是可行的方法,您也可以考虑使用.NET Remoting来实现此目的。
你要找的是DataContract属性。另请参阅:MSDN使用数据契约。
数据契约是服务和客户端之间的正式协议,抽象地描述要交换的数据。也就是说,为了通信,客户端和服务不必共享相同的类型,只需共享相同的数据契约即可。数据契约精确地定义了每个参数或返回类型要序列化(转换为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; }
}
}
WCF可以自动处理很多东西,但是手动通过管道发送数据也不难。
如果像其他人建议的那样使用WCF,请注意你仍然没有发送“对象”。你仍然发送数据,而WCF对此非常明确(这就是为什么他们称其为DataContractSerializer而不是ObjectSerializer)。具体来说:
1)对使用DataContract序列化发送的对象执行的任何操作都将在本地执行。
2)如果相同的对象被发送两次,则不会自动更新任何旧版本,并且它们将没有引用相等性。您将拥有两个数据结构,就C#而言,它们是完全无关的。
3)对象的更新仅在本地执行,不会自动更新其他具有“相同”对象的进程。
如果您绝对确定需要在进程之间传递“对象”,则可以编写自己的代码(即使更费力),或使用System.Remoting命名空间。
即使使用System.Remoting,请意识到我上面谈到的是实际发生的事情,并根据此设计您的对象和系统。这样会得到更好的结果。