copies vs References
romoting跨应用程序域进行通信时,有两种传值方式:副本与引用.本篇讨论,如何选择,及分别如何
实现,优缺点等
一.如何选择
跨进程通信需要具备以下条件:存在向进程外的调用方提供功能的服务器对象,存在对服务器对象进行
调用的客户端,并具有一个将调用从一端运送到另一端 的传输机制。服务器方法的地址是逻辑地址,并且可
在一个进程中正常工作,但不能在其他客户端进程中正常工作。若要解决此问题,客户端可以通过创建对象的
完整副本,然后将该副本移动到客户端进程来调用服务器对象,这样在该客户端进程中就可以直接调用该副本
的方法了。
然而,许多对象无法或不应复制和移动到某个其他进程来执行。具有许多方法的非常大的对象不应复制到
或通过值传递到其他进程。通常,客户端仅需要由服务器对象上的一个或几个方法返回的信息。复制整个服务
器对象将是对带宽以及客户端内存和处理时间的浪费,因为这种复制可能会复制与客户端需求无关的大量内部
信息或可执行结构。另外,许多对象公开公共功能,但需要的却是用于内部执行的私有数据。复制这些对象会
使未经授权的客户端能够查看内部数据,从而造成潜在的安全问题。最后,某些对象使用的数据无法以任何可
理解的方式复制。例如,FileInfo 对象包含一个对操作系统文件的引用,此文件在服务器进程的内存中具有唯
一的地址。您可以复制这个地址,但它在其他进程中将无效。
在这些情况下,服务器进程应当向客户端进程传递一个对服务器对象的引用,而不是传递该对象的副本。
客户端可以使用此引用来调用服务器对象。这些调用不在客户端进程中执行。而远程处理系统会收集有关调用
的所有信息并将其发送到服务器进程,在该进程中,将解释这些信息并查找正确的服务器对象,之后代表客户
端对象向该服务器对象发出调用。然后,调用的结果被发送回客户端进程以返回到客户端。带宽仅用于关键的
信息:调用、调用参数以及任何返回值或异常。
二.如何实现
副本实现:将自定义类标记为可序列化(Serializable)便可实现此目的。如下:
[Serializable]
public class ServerObject {
public int n1=0;
}
引用的实现:将自定义类继承自MarshalByRefObject。如下:
public class ServerObject: MarshalByRefObject{
public int n1=0;
}
三.总体概括
远程处理系统的真正优点在于,它使不同应用程序域或进程中使用不同传输协议、序列化格式、对象生存
期方案和对象创建模式的对象之间能够相互通信。此外, 远程处理使您几乎可以在通信进程的任何阶段进行干
预。
使用对象引用在服务器对象和客户端之间进行通信是远程处理的核心。