在C#中在服务器和客户端之间传递自定义复杂对象

时间:2011-07-16 01:31:22

标签: c# wcf rmi

我有一个桌面C#应用程序,我想分成两部分 - 服务器部分和客户端部分。我的应用程序已经分成两个非常独立的部分,通过交换一些(复杂的!)对象进行通信。

如果我想将我的应用程序的一部分放在某个Web服务器上,我应该使用什么样的技术在服务器部分和客户端部分之间传递这些自定义复杂对象?我在考虑WCF,但是......我不确定WCF可以轻松处理(发送/接收)自定义对象(由许多其他自定义对象组成)。我不需要WCF,因为我不打算向任何第三方提供我的服务,我不打算将我的客户端应用程序移植到其他操作系统......

这就是为什么我很困惑并需要你的帮助:我应该使用什么样的远程技术?

2 个答案:

答案 0 :(得分:4)

WCF代表Windows Communication Foundation。换句话说,它涉及一般的跨过程/机器通信,而不仅限于血液系统

要记住WCF的一件事是,尽管有外观,但实际上并没有传递对象 - 序列化程序使用这些对象来生成消息。另一方面,它将反序列化为一个独立的副本。与COM不同,您不会将引用返回给发件人上的对象。

这很重要的原因是因为如果复杂对象具有不可序列化的状态,例如套接字连接,那么这将不会使它到达接收方

此外,使用DataContractSerializer(默认值)除非您的对象使用[Serializable]属性进行注释,或者您使用[DataContract]和[DataMember]注释类,您将只发送公开公开的状态(通过公共领域或财产)。

对于WCF来说,这不是一个纯粹的问题;远程处理需要从MarshalByRefObject派生的对象或使用[Serializable]属性进行注释。构建分布式系统与构建共享相同内存地址空间的系统完全不同。您必须仔细考虑如何定义分布式部分之间的边界,例如,许多小型调用会破坏您的性能而不是几个数据丰富的调用(尽管根据您的描述,这可能不是影响您的问题)

所以WCF可以处理任意复杂的对象图,但只记得上面有关序列化的要点

答案 1 :(得分:0)

嗯,WCF中的DataContracts支持复杂的对象,所以我没有看到它的问题(你的对象有多复杂);但是你应该在你的情况下使用足够的技术。你可以使用Remoting,地狱,甚至套接字;但几乎在所有情况下都是过度杀戮而且.NET堆栈中的内容太低了;你只会浪费你的时间来实施。

如果你没有理由反对WCF,我会这样做,因为它非常简单和强大。如果您愿意,还有标准的ASP.NET ASMX Web服务。

有一点需要注意,无论哪种技术,您都应该在分布层中构建代码,从而暴露出粗粒度的方法。