转:JGTM'2004 [MVP] 对MarshalByRefObject的讲解

简介:
问:
打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解?

回复:
按照package的意思理解——当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializable的ObjRef实例——这个ByRef就是指ObjRef这种形态);同理,当打包以后传输到目标地点,还要执行unmarshal的操作将其还原为内存中的对象。:)

问:
谢谢!
MarshalByRefObject是不是可以这样理解:对被引用的对象进行Marshal。如果按照package的意思理解,那package的过程是怎样的?

MSDN上这样讲:
MarshalByRefObject是通过使用代理交换消息来跨应用程序域边界进行通讯的对象的基类.
MarshalByRefObject对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问MarshalByRefObject时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。

在Marshal中,上面所说的代理是什么?有什么用?

MSDN上还讲到:
当跨应用程序域边界使用类型时,类型必须是从 MarshalByRefObject 继承的,而且由于对象的成员在创建它们的应用程序域之外无法使用,所以不得复制对象的状态。

既然对象的状态不能传递过去,那传递这个对象又有何意义?
第一次去理解MarshalByRefObject,有的问题可能提的比较肤浅,请您指点。

回复:
MarshalByRefObject是所有可以在AppDomain边界外部访问的对象的基类,重心不是marshal,而是object,即object that could be marshaled by reference,也就是可以通过Ref(实际上是ObjRef对象)的机制进行“封送”(MSDN中文版对marshal一词的翻译)的对象。封送的行为是由代理来做的,这里说的代理就是我文章中讲过的.NET Remoting的真实代理(即RemotingProxy)。真实代理不是有一个Invoke()方法吗?当你透过对一个MBRO的透明代理访问该对象的方法时,透明代理将把基于堆栈的方法调用转换为方法调用消息(IMethodCallMessage)并转发给真实代理(在Remoting的场合中也即RemotingProxy),而RemotingProxy的任务就是把对象封送并连同方法调用消息一起转发给远程应用程序域;到达目的地以后的操作类似:远程应用程序域中的监听方当收到发来的方法调用消息时,先取出封送好的ObjRef(这个对象里面保存着发来调用的那个对象!),将其结封(unmarshal)为本地的对象,并获得其透明代理,然后就可以把方法调用消息在转换回基于堆栈的调用发送给这个对象。

对象是在本地维护的,但是方法可以在远程调用。你比如说一个web应用程序,你是通过本地的浏览器远程访问这个应用程序,但是应用程序的状态不会由你的浏览器负责(所以你只是在访问这个应用程序提供给你的功能而已,你并没于拥有应用程序本身,包括其所有数据),你只是发送一个个的请求,服务器告诉你处理的结果。在Remoting中也是一样,当你获得一个远程对象的时候,你实际上只拥有对这个对象的一个远程引用,虽然你可以调用它的方法,但实际上这些操作都是发生在远程的(就是前面讲过的过程),你只是传入了一些参数,得到了一个结果,但对象的状态还是在远程维护的(换句话说,对象本身也就是对象的所有状态并没有被往返传递,传递的只是传入传出的参数——当然,如果参数是一个MBRO的话,还是传递对象被封送的引用)。
也许应该给你准备一个好理解的例子……你就会豁然开朗了。:)

问:
我这样的理解对不对?
一般的对象与从MarshalByRefObject继承的对象区别是:
一般的对象只能在本地应用程序域之内被引用,而MarshalByRefObject对象可以跨越应用程序域边界被引用,甚至被远程引用。

回复:
Exactly! 当对象跨出AppDomain边界的时候,实际上只是它的一个引用(ObjRef)。你比如说吧:

public class LocalObject
{
public void CallRemoteObject(MarshalByRefObject mbro)
{
Console.WriteLine(mbro.ToString());
}
}

当传入一个在本地创建的mbro对象时,ToString()方法是直接发送给对象的;而当mbro是通过Remoting创建的远程对象的话,实际上它只是一个包含有已经marshal好的ObjRef的透明代理,ObjRef里面有什么?对象实例的URI!所以当你调用这个远程对象时,相当于向这个远程端口(tcp://remoteServer/xxxx.rem)发送方法调用消息而已。只不过透明代理隐藏了对象位置的概念,而RemotingProxy真实代理则是实际上处理远程方法调用和对象封送的中枢对象。



本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2010/04/16/1713427.html,如需转载请自行联系原作者
相关文章
|
设计模式 架构师 大数据
我的架构师之路——阿里云 MVP 沈剑
沈剑,公众号“架构师之路”的作者,曾任百度高级工程师和58同城高级架构师、技术委员会主席、技术学院优秀讲师,现为到家集团技术委员会主席和技术VP,同时也是快狗打车(原58速运)的CTO。本文是沈剑老师在阿里云的直播中分享的一些自己关于架构师的看法和成为架构师的心路历程的第一部分。
6034 0
我的架构师之路——阿里云 MVP 沈剑
|
6月前
|
Android开发
mvp架构
mvp架构
123 9
|
6月前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
前端开发 数据处理
简单教你写MVP模式
V层如果要更新数据,V层会通知P层,P层会去M层获取数据,然后P层再将拿到的数据传给V层,V层进而实现更新。
127 0
|
数据可视化
《谁是MVP》直播系列——想听什么,你说!
继MVP作为分享嘉宾参与阿里云 ACE(Alibaba Cloud Engineer)同城会分享和Tech Show分享之后,我们又玩起了直播。 春节前我们开通了两场直播得到了开发者的热烈响应和好评。 那么,好消息终于来了: 你们想要看的MVP和你们感兴趣的内容,统统都在这里!
1771 0
|
前端开发 Android开发 数据格式
谈谈我对 MVP 的理解
说实话,MVP 这种模式或者说设计思想也已经出来很久了,现在最新的使用的是 MVVM 设计模式,不断对于萌新来说,还是需要一步一步的向前走。毕竟,人不能一口吃成一个大胖子是吧。
1474 0
|
人工智能 大数据 云计算
|
物联网
当MVP与阿里云一起踏上西行远征——阿里云MVP“戈壁之路”徒步记行
4天3夜,暴走戈壁102公里,相当于2个半马拉松、绕操场250圈……8月初,阿里云MVP戚俊、周公爽、刘洪峰、章斌参加阿里云“玄奘之路”徒步活动,与阿里云同学一起穿越戈壁,突破极限,寻找自己。这一路,MVP收获了什么?在阿里云身上又看到了什么?
10699 0