请一定记住,在某个应用程序域中创建并因此特定于它的对象可以在此域中直接调用,但此对象必须经过一些特殊处理后才可以在它的域以外使用。并非每种类型的对象都可以跨越域边界高效地发布或使用;因此,必须根据应用程序的需要决定要发布哪种类型的对象。对于分布式应用程序,对象分为两种简单的类别:不可远程处理的和可远程处理的对象。
不可远程处理的对象
某些对象不能离开它们的应用程序域;它们永远不会被封送处理,原因是它们不声明序列化方法。这些不可远程处理的对象主要是在创建它们的同一应用程序域内使用,并且始终从该应用程序域中直接访问。.NET Framework 类库中的大多数基类是不可远程处理的对象。不可远程处理的对象无法在其他应用程序域中复制或表示。这些对象只能从它们的初始应用程序域中进行访问。
可远程处理的对象
可远程处理的对象可以使用代理在其应用程序域或上下文之外进行访问,也可以复制它们并且可以将这些副本传递到它们的应用程序域或上下文外;也就是说,某些可远程处理的对象通过引用传递,而另一些通过值传递。
可远程处理的对象是能在大范围的分布式环境中正常运行的对象。有两种主要的可远程处理的对象:
-
值封送对象,它们被复制并从应用程序域传递。
-
引用封送对象,将为其创建代理,而该代理由客户端用于远程访问对象。
值封送对象
值封送 (MBV) 对象声明它们的序列化规则(通过实现 ISerializable 来实现其自身的序列化,或者通过用 SerializableAttribute 修饰,该属性通知系统自动序列化该对象),但是不扩展 MarshalByRefObject。远程处理系统创建这些对象的完整副本并将副本传递到进行调用的应用程序域。一旦副本到达调用方的应用程序域内,对该副本的调用就是对该副本的直接调用。此外,作为参数传递的 MBV 对象也会通过值传递。除了声明 SerializableAttribute 属性或实现 ISerializable 之外,您不需要执行其他任何操作即可将类的实例跨越应用程序或上下文边界通过值进行传递。
注意 |
|---|
| 从 .NET Framework 1.1 版开始,远程处理基础结构不会自动对服务器上的某些类型进行反序列化。如果您的方案存在这种情况,则必须先将服务器的反序列化级别设置为 Full,然后服务器才能反序列化并使用您的 MBV 对象。有关更多信息,请参见 .NET 远程处理中的自动反序列化。 |
如果就性能或处理方面的原因而言,将对象的完整状态和任何可执行功能移动到目标应用程序域具有一定的意义,则应使用 MBV 对象。在许多方案中,这减少了跨网络、进程和应用程序域边界的冗长而耗费资源的往返过程。MBV 对象还可以从对象的原始应用程序域内直接使用。在这种情况下,由于不进行任何封送处理,因此不创建任何副本而且访问非常高效。
另一方面,如果发布的对象非常大,那么在繁忙的网络上传递整个副本对于应用程序来说可能不是最佳的选择。此外,永远不会将对复制对象的状态所做的更改传回到起始应用程序域中的原始对象。在抽象级别上,这种方案类似于客户端浏览器所请求的静态 HTML 页的方案。服务器复制文件,将其写入到流中,发送出去,然后忘掉它。所有后续的请求都只是对其他副本的其他请求。
如果您未扩展已实现 ISerializable 的类,则通过使用 SerializableAttribute 创建值封送类型。在此情况下,必须为您的类型实现 ISerializable。
远程处理系统广泛使用可序列化的对象。对其他应用程序域中的对象的引用(由 ObjRef 类在远程处理系统中表示)本身是可序列化的;必须能够将它精确地复制并将副本发送给请求。实现 IMessage 的消息对象也是如此,这是因为它们是调用数据和所有其他必需的对象引用的一般容器。另外,仅传输数据的对象通常是可序列化的对象。例如,DataSet 扩展实现 ISerializable 的 MarshalByValueComponent。
远程处理用户定义的异常
系统定义的异常都是值封送类型(它们实现 ISerializable 接口),当被远程对象引发时,它们将自动复制到调用方(如果远程处理配置允许)。(从 .NET Framework 1.1 版开始,<customErrors> 元素必须设置为 off 才能使异常流向调用方。)
有关如何创建可由远程对象引发并由远程调用方捕获的异常类型的更多信息,请参见如何:创建可由远程对象引发的异常类型。
引用封送对象
引用封送 (MBR) 对象是至少扩展 System.MarshalByRefObject 的可远程处理的对象。根据已声明的激活类型,当客户端在它自己的应用程序域中创建 MBR 对象的实例时,.NET 远程处理基础结构在调用方的应用程序域中创建表示该 MBR 对象的代理对象,并向调用方返回对此代理的引用。然后,客户端将在此代理上进行调用。远程处理将封送这些调用,将其发送回起始应用程序域,并引发对实际对象的调用。
本文介绍了在分布式应用程序中,对象如何跨越应用程序域边界进行访问。详细解释了不可远程处理的对象和可远程处理的对象的区别,包括值封送对象和引用封送对象的特点及应用场景。
注意

被折叠的 条评论
为什么被折叠?



