Java开发网 |
注册 |
登录 |
帮助 |
搜索 |
排行榜 |
发帖统计
|
您没有登录 |
» Java开发网 » Java EE 综合讨论区
打印话题 寄给朋友 订阅主题 |
作者 | Corba 如何返回另一个Corba对象 [Re:gxlzlu] |
sothis
CJSDN高级会员 发贴: 168 积分: 60 |
于 2002-12-20 09:58
CORBA里面传送的东东,如果IDL中定义的是interface的话,那么传送的是reference,在CORBA中叫做IOR。如果是数据类型的话,如struct,那么传送的是值。两者的区别是显然的,就是往往interface里面只有方法,而数据类型里面只有变量。方法代码没办法传递,所以只有传引,传了引用后如果想要访问该方法,就通过远程调用来访问远端进程中的代码。 但是有时候希望有两者的结合,设想一下传送的东西中希望携带很多变量(值),同时又是一个对象,传过来后可以调用里面的方法体。有什么好处?第一是有时候变量值传送过来就好了,没有必要在需要值的时候再去远端进程要,减少网络交通,提高运行效率啊。第二是java都传值,CORBA要和2EE系统融合得更好的话,应该支持传值方式啊(RMI over IIOP的时候必须要考虑的问题哦)。这时候面临一个必然的问题就是类实例在客户端的再生问题。java里面用系统的serialization来做,没问题,两边都是JVM,代码和类加载方式一致么;CORBA里面,就只能交给Factory来做了,因为两边代码和类加载机制会不一样。Factory做的事是unmarshel,就是把得到的流恢复成类实例。各种语言的Factory实现手法是不一致的,对于java来讲,一般利用seriallization来做。 类实例在客户端再生过程中,成员变量的再生比较好理解,从流中取出来就可以了。但是成员函数呢?这些方法实现代码从哪儿来?从远端进程中过来?当然不行。记住CORBA是跨平台跨语言的,能设想从UNIX进程中传送过来的java代码(假如能传的话)能在Windows C++进程中执行的起来么?当然不行。代码实现必须在本地提供。在那里提供?在前面提到的对象类型所对应的Type Factory中提供。假如在客户端没有相应的设施提供将没有办法再生类实例,引发CORBA的Marshel异常。 这其实是CORBA中的一个话题叫做OBV(Object By Value),如果大家手上有CORBA中间件安装比方说VisiBroker的话,那么中间往往是带有OBV的例子的,可以参照这些例子。这里只是简述一下大概的做法。 准确的IDL定义: valuetype returnValue{ setA(); getA(); } interface test{ returnValue getSomeValue(); } 代码实现(java): 在client端需要实现returnValue值对象的所有方法以及returnValueFactory类,运行的时候这些都需要在类路径中。 在Server端需要实现test这个CORBA对象的实现和server主程序,当然也会引用到returnValue值对象的实现。 为什么这个Applet不能在浏览器显示啊? |
话题树型展开 |
人气 | 标题 | 作者 | 字数 | 发贴时间 |
8889 | Corba 如何返回另一个Corba对象? | gxlzlu | 194 | 2002-12-15 04:12 |
8214 | Corba 如何返回另一个Corba对象 | sothis | 1185 | 2002-12-20 09:58 |
已读帖子 新的帖子 被删除的帖子 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |