如何在.NET 3.5中通过命名管道发送对象?

11

你能告诉我在 .NET 3.5 中通过命名管道发送对象的最佳方法是什么吗?


这里有一篇有用的文章,如果想要通过流发送对象,请首先在这里这里阅读相关内容。 - Vinay Sajip
3
在进程内通信中,你并不会发送对象本身,而是发送它们的表示,可以是文本或二进制格式。然后在接收端使用这些表示来重新创建对象。 - blowdart
请查看我的更新答案,其中有关于将对象序列化到流的链接。 - Vinay Sajip
6个回答

3

如果您正在使用WCF,为什么要使用XML序列化?为什么不使用数据契约序列化器,它可以允许对象以二进制形式发送? - John Saunders
1
我建议如果他不想使用WCF,可以使用XmlSerializer,是的,他也可以使用Data Contract Serializer。 - Arsen Mkrtchyan

3

WCF NetNamedPipes绑定是可行的方法,您也可以考虑使用.NET Remoting来实现此目的。


2

如果您正在创建一个需要IPC的Windows服务,该怎么办? - user8128167

1

你要找的是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; }
    }
}

1
作为对原始问题的评论所指出的,你不能直接发送对象到其他进程。你可以发送数据给另一个进程,然后使用这些数据在其他进程中创建原始对象的代理或者类似物,但是你无法直接发送一个对象
即使技术上提供了跨进程对象传递语义的技术,在底层也是做着同样的事情。因此,你应该始终使用“尝试执行操作,如果失败则捕获异常”的风格来进行操作,而不是“确保能够执行操作,然后再执行”的风格。即使对象看起来处于有效状态,你看到的可能是旧数据,所以当你尝试执行实际操作时,它可能无效。
因此,既然你不能发送对象,那么你最终要做的实际上是将一些数据序列化(使用XmlSerializer、DataContractSerializer或其他方式),在另一端读取数据流,并创建一个新的对象来表示原有对象。与实际的活动对象相比,你可能会发现创建一个单独的对象来表示你希望通过管道发送的数据更容易一些。

WCF可以自动处理很多东西,但是手动通过管道发送数据也不难。

如果像其他人建议的那样使用WCF,请注意你仍然没有发送“对象”。你仍然发送数据,而WCF对此非常明确(这就是为什么他们称其为DataContractSerializer而不是ObjectSerializer)。具体来说:

1)对使用DataContract序列化发送的对象执行的任何操作都将在本地执行。

2)如果相同的对象被发送两次,则不会自动更新任何旧版本,并且它们将没有引用相等性。您将拥有两个数据结构,就C#而言,它们是完全无关的。

3)对象的更新仅在本地执行,不会自动更新其他具有“相同”对象的进程。

如果您绝对确定需要在进程之间传递“对象”,则可以编写自己的代码(即使更费力),或使用System.Remoting命名空间。

即使使用System.Remoting,请意识到我上面谈到的是实际发生的事情,并根据此设计您的对象和系统。这样会得到更好的结果。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接