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

本文关键字:自定义 复杂 对象 客户端 服务器 之间 | 更新日期: 2023-09-27 18:02:29

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

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

这就是为什么我很困惑,需要你的帮助:在我的情况下,我应该使用哪种远程技术?

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

WCF代表Windows Communication Foundation。换句话说,它是通用的跨进程/机器通信,而不限于异构系统

关于WCF要记住的一件事是,尽管表面上看,实际上你根本没有传递对象——对象是由序列化器用来生成消息的。在另一端,它将反序列化成一个独立的副本。与COM不同,您不会在发送方上获取对对象的引用。

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

此外,使用DataContractSerializer(这是默认的),除非您的对象用[Serializable]属性注释,或者您用[DataContract]和[DataMember]注释类,否则您将只发送公开暴露的状态(通过公共字段或属性)。

这不仅仅是WCF的问题;远程处理要求对象派生自MarshalByRefObject,或者用[Serializable]属性进行注释。构建分布式系统与构建共享相同内存地址空间的系统非常不同。您必须仔细考虑如何定义分布式块之间的边界,因为,例如,大量的小调用会杀死您的性能,而不是少量的数据丰富的调用(尽管从您的描述来看,这可能不是影响您的问题)

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

嗯,WCF中的数据合约支持复杂对象,所以我不认为这有问题(你的对象有多复杂);然而,在您的情况下,您应该使用足够的技术。你可以使用Remoting,甚至socket;但在几乎所有情况下,它都是多余的,并且在。net堆栈中占据的位置太低;你只会在执行上浪费时间。

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

需要注意的一点是,无论采用哪种技术,都应该在分布层中结构化代码,从而暴露粗粒度的方法。