首页 > 其他分享 >JGTM'2004 [MVP] 对MarshalByRefObject的讲解 (zz.is2120)

JGTM'2004 [MVP] 对MarshalByRefObject的讲解 (zz.is2120)

时间:2023-06-09 17:02:07浏览次数:40  
标签:MVP 调用 对象 is2120 代理 应用程序 2004 MarshalByRefObject 远程


//z 2012-09-11 09:30:29 [email protected][T30,L404,R7,V203]
 Anyone can explain the major use of MarshalByRefObject
What's the purpose for MarshalByRefObject?


1. Remoting; it means that between AppDomains or machines, rather than serialize and transfer the object, the object stays at one end and a proxy is created at the other. All method calls to the proxy are intercepted and the call is transmitted as RPC, causing the method to execute on the other machine (typically serialising the arguments and return value).

Note: this can lead to unexpectedly "chatty" interfaces. The object/proxy/RPC approach is now less preferable to approaches with an explicit service boundary; Microsoft now recommends WCF instead of remoting.



2.

If you have an object that derives from ContextBoundObject (which itself derives fromMarshalByRefObject) you can instantiate it in a separate Context within the same AppDomain and have communications between objects automatically go through the Remoting proxy system - allowing you to plug custom sinks into the Remoting sink-chain.

This ultimately allows you to 'decorate' method calls to your objects and implement cross-cutting services, such as logging and security etc.



it basic use is for support access of objects between two appdomains and these appdomains can be on the same computer or in the different computers via remoting.




//z 2012-09-11 09:30:29 [email protected][T30,L404,R7,V203]


问:


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

  

回复

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

  

//z 2012-09-11 09:30:29 [email protected][T30,L404,R7,V203]
问:

谢谢!

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真实代理则是实际上处理远程方法调用和对象封送的中枢对象。


//z 2012-09-11 09:30:29 [email protected][T30,L404,R7,V203]



标签:MVP,调用,对象,is2120,代理,应用程序,2004,MarshalByRefObject,远程
From: https://blog.51cto.com/u_16156420/6449447

相关文章

  • [NOIP2004 普及组] 火星人
    题目简单,A完之后看题解,看到大佬的一片题解有感而发,这位大佬的DFS确实精妙看完题之后你会发现只需要5行就可以解决,c++自带的全排列函数,但是有位大佬手写DFS的方法非常巧妙,直接精确定位,让我对dfs的理解多多少少又加深一层题目描述人类终于登上了火星的土地并且见到了神秘......
  • Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
    1.什么是MVP? MVP(ModelViewPresenter)其实就是一种项目的整体框架,能让你的代码变得更加简洁,说起框架大家可能还会想到MVC、MVVM。由于篇幅原因,这里我们先不讲MVVM,先来看一下MVC。其实Android本身就采用的是MVC(ModelViewControllor)模式、其中Model指的是数据逻辑和实体模型......
  • 【P4331 [BalticOI 2004]】Sequence 数字序列 题解(左偏树维护动态区间中位数)
    左偏树维护动态区间中位数。传送门P4331BalticOI2004Sequence数字序列。Solution1我的思路和题解前半部分完全重合了((如果按照单调不增去分割\(a\)序列的话,对于每一段我们能很简单地得出它的最佳答案:中位数。发现严格单调很难做,很难拿捏,考虑对\(a\)序列的每一项都进......
  • C# MVP架构力位移曲线监控源码! 1,完整工程,完整应。 2,现
    C#MVP架构力位移曲线监控源码!1,完整工程,完整应。2,现场实战项目,vs2015开发。3,用到dev控件,我会赠送。4,完整yuan代码可编译,可修改,可debug。5,这是一个工业应用上位机,下位机为plc。6,设备启动后上下位机通信完成全自动动作。7,tcpip扫码,监控曲线,存数据,导数据。YID:79396267090793......
  • [NOIP2004 普及组] 不高兴的津津
    [NOIP2004普及组]不高兴的津津题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不......
  • 【题解】P4331 [BalticOI 2004]Sequence 数字序列
    以各种方式出现被玩烂的题目,算是小trick题?cpeditor意外地好用思路可并堆。平行时空同位体:CF13CP4331P4597CF713CP2893已知做法:\(O(n^2)\)dp:令\(f[i][j]\)为前\(i\)个数不超过\(j\)的最小代价优化:使用堆维护dp产生的折线(P4597题解区)\(O(n\logn......
  • [NOIP2004 提高组] 津津的储蓄计划
    [NOIP2004提高组]津津的储蓄计划题目描述津津的零花钱一直都是自己管理。每个月的月初妈妈给津津\(300\)元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上\(20\%\)还给津......
  • 20042124_chappie
    [换成自己的源]docker-machinesshdefaultsed-i"s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=https://2w188x2k.mirror.aliyuncs.com|g"/var/lib/boot2docker/profileexitdocker-machinerestartdefault [打开rknndocker]dockerrun-t-i--privilege......
  • ubuntu2004 下源码安装boost
    ubuntu2004下源码安装boosthttps://www.aiuai.cn/aifarm1186.htmlhttps://www.boost.org/users/history/version_1_78_0.htmlhttps://cloud.tencent.com/developer/article/1804511https://stackoverflow.com/questions/12578499/how-to-install-boost-on-ubuntuboost版本在......
  • mvp架构
    MVPHelper插件的使用(320条消息)MVPHelper更新日志---新增常规分包模式_mvp怎么分包合理_三精-大精wing的博客-CSDN博客实例1.LoginContractor 将三个接口合并为一个publicinterfaceLoginContract{interfaceModel{voidlogin(Stringname,Stringpsw......