`
pleasetojava
  • 浏览: 729459 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多

对象引用
CORBA作为传统中间件的典型代表,强调屏蔽底层网络对上层应用的差异性来建立一个统一的位置视图,使得程序员可以使用经典的面向对象思想开发客户程序和服务程序,而不受底层网络具体通信协议的困扰。举例而说,假如程序员开发了两个对象A和B,A位于机器Host1上,而B位于机器Host2上,业务逻辑要求A调用B的方法method()。在传统的TCP/IP Socket编程中,程序员不得不自己设计通讯协议,编码格式,参数解析等模块。这些工作即烦琐又容易出错。而CORBA基本上将程序员从与底层网络相关的协议设计中解放出来。程序员只用在A的模块稍微增加几行代码就可以实现远程对象的访问。对象引用就是CORBA为解决分布式系统设计中对象位置的透明性而设计的。
让我们从问题出发讨论分析对象引用的基本概念。
在单一进程空间中,A对象要调用B对象的方法,A对象必须要获得B对象的指针(或引用)。然而在分布式系统中,将B的地址传递给A是没有意义的。因为两者不在同一个进程空间。如果假设B的地址存在于A的进程空间中,然后调用B的方法,将带来内存非法访问等异常。那么CORBA是怎么解决这个问题的?实际上,为了定位B对象,我们需要的是一个超级指针的概念。因为原始的指针只包含地址信息,我们就在超级指针中新增主机地址信息、进程信息和对象的标识这三项信息。这实际上就是CORBA规范中定义的IOR(互操作对象引用)的格式。IOR格式定义如下:接口ID:主机地址:对象关键字。其中接口ID是用来唯一标识对象接口信息的,使用于CORBA高级服务接口池。格式为"IDL:对象名字:版本号"。主机地址包含协议类型和具体的地址,对于TCP/IP,就是IP地址和端口号。前两项信息是标准定义,不同CORBA产品实现厂商必须遵循。对象关键字包含POA标识和对象ID两项信息。对象关键字的语义在规范中没有指出,依赖于厂商的实现。
IOR只是定义了分布式对象的位置格式。依然不是我们所要的编程级别的超级指针。我们需要的是一个能够隐藏底层网络信息和对象位置信息的指针。我们使用这个指针就可以如同单机环境编程一样,非常舒服的调用B对象的方法。CORBA是怎么做到的呢?CORBA在客户端提出了一个代理对象的概念,我们的超级指针指向的并不是远程对象,而是这个代理对象。代理对象的外部接口和B对象一样,但是其内部的实现负责了参数编码,建立连接,发送数据包,接受数据包,解码获得返回值等等繁琐的网络协议设计。当然,这些工作我们程序员并不用做,还记得上一节提到的IDL编译器吗,编译器会帮我们生成这样一个代理类。
有了这个代理对象,我们还必须想办法构造它。构造它时,必须指出远程对象的位置信息。怎么构造?有两种方法,一种是获得IOR信息,直接构造。由服务器端公布这个IOR字符串,我们想办法拿到IOR串,然后调用ORB的string_to_object方法创建代理对象。string_to_object是CORBA规范中定义的标准ORB方法,其声明如下:Object string_to_object(in string or)。返回值是Object类型。实际上Object类型是所有代理对象的基类,获得这个Object对象后,还要使用代理类的_narrow(Object obj)方法才能获得实际需要的代理对象。在CORBA规范中对输入参数定义了三种方法,一种是直接表达IOR本身,另一种是内容为IOR的文件的地址,还有一种是使用corbaloc地址。
1)IOR形式,则输入参数形式为"IOR:12412abc333000"的字符串,IOR是必须的,后面跟200到800个16进制形式的数字。这些数字就是IOR所带的信息。
2)文件形式:输入参数形式为"file:/IOR文件绝对地址"或者"relfile:/相对路径"
3)corbaloc形式:输入参数格式为"corbaloc:iiop:ip:port/对象名字"。其中corbaloc:iiop是格式必须要的,其后是IP地址,/后是对象名字。另外还有一种rir格式,详细见CORBA规范。

下面给出第2个方法的代码片段:

int commonproc(CORBA::ORB_ptr orb, int argc, char* argv[])
...{
//
// 从文件helloobj.ref中获取服务对象hello的引用
//

CORBA::Object_var obj = orb -> string_to_object("relfile:/helloobj.ref");
if(CORBA::is_nil(obj))//判断对象引用是否为空,不能与NULL判断,不是传统的指针概念
...{
cerr return -1;
}

Hello_var hello = Hello::_narrow(obj);
assert(!CORBA::is_nil(hello));

//
// 调用服务对象hello中的服务方法hello_world()
//
cout hello_world()'"
hello -> hello_world();

cout
return 0;
}

从代码可以发现,对于客户程序员,没有socket、没有阐述编解码、没有发包收包,一切都是那么自然

前两种方法比较简单,但客户端和服务器端依然存在耦合关系,因为我们必须要拿到这个IOR,而怎么拿到?又成了问题。当然如果你是在自己的机器上学习CORBA,服务器生成了一个IOR文件后,你把它拷贝到客户端的目录下也可以。第三种方法耦合度比较高,虽然没有IOR,但我们必须显示知道服务器对象的地址信息。
另一个方法是借助第三方,假设服务器和客户端有一个众说周知的名字服务,服务端new出B对象后,获得其对象引用,然后在名字服务上发布对象引用,建立一个逻辑名字到对象引用的映射。客户端只用在名字服务查询逻辑名即可获得对象引用。这种方法可以很好的实现服务程序的位置透明,服务程序可以随意改变位置信息,而客户程序对此并不感知。当然,名字服务也是对象,客户要使用它也必须获得其对象引用。ORB提供resolve_initial_interface方法获得名字服务,输入参数是"NameService",返回值是名字服务的对象引用。其方法定义为Object resolve_initial_interface(in string or)。

下面给出服务方通过名字服务发布对象引用的代码,java语言实现

// create and initialize the ORB
ORB orb = ORB.init(args, null);

// get reference to rootpoa & activate the POAManager
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();

// create servant and register it with the ORB
HelloImpl helloImpl = new HelloImpl();
helloImpl.setORB(orb);

// get object reference from the servant
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);

// get the root naming context
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
// Use NamingContextExt which is part of the Interoperable
// Naming Service (INS) specification.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// bind the Object Reference in Naming
String name = "Hello";
NameComponent path[] = ncRef.to_name( name );
ncRef.rebind(path, href);

System.out.println("HelloServer ready and waiting ...");

// wait for invocations from clients
orb.run();

通过这两种方法获得的指向代理对象的指针,在CORBA世界中称之为对象引用。对象引用只是一个指向代理对象的指针。实际的远程对象是否存在,客户是不知道的。如果远程对象并不存在,而调用其方法会产生Object_not_exist异常。另外,对象引用只能由服务程序发布,客户不能创建对象引用,客户只有获取对象引用并使用的权力。
总结,我们通过分析分布式系统设计的一些问题,讨论CORBA核心概念对象引用。了解了IOR和对象引用的获取方法。

分享到:
评论

相关推荐

    未将对象引用设置到对象的实例--可能出现的问题总结

    ### 未将对象引用设置到对象的实例--可能出现的问题总结 在进行软件开发尤其是Web应用程序开发过程中,经常会遇到“未将对象引用设置到对象的实例”这类异常,这种异常通常表现为`System.NullReferenceException`。...

    值引用与对象引用

    ### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...

    未将对象引用设置到对象的实例问题原因

    ### 未将对象引用设置到对象的实例问题原因 在.NET开发过程中,特别是使用ASP.NET进行Web应用程序开发时,开发者可能会遇到一个常见的异常——`System.NullReferenceException`。这一异常通常意味着试图访问一个未...

    c# DataGridView 导出数据到sql中出现错误“未将对象引用设置到对象实例中”

    DataGridView 导出数据到 SQL 中出现错误“未将对象引用设置到对象实例中” 在 C# 中,DataGridView 控件广泛应用于数据展示和编辑,但是在导出数据到 SQL 中时,常常会出现“未将对象引用设置到对象实例中”的错误...

    未将对象引用设置到对象的实例(C#出現的錯誤)

    "未将对象引用设置到对象的实例"錯誤個人總結

    java中对象和对象引用的区别!

    ### Java中对象与对象引用的区别 #### 基础概念 在Java编程语言中,对象与对象引用是非常基础且重要的概念。理解它们之间的区别对于掌握Java面向对象编程至关重要。 #### 对象与引用定义 - **对象**:在Java中,...

    java对象引用易混解析

    ### Java对象引用详解 #### 一、Java对象与引用的基本概念 在Java中,对象是类的一个实例,而引用则是指向这些对象的变量。理解Java中的对象与引用之间的区别至关重要,因为这涉及到如何管理和操作对象。 #### 二...

    未将对象引用设置到对象的实例 (System.NullReferenceException)

    //a是Null对象 protected void Page_Load(object sender, EventArgs e) { a.ToString();//调用一个Null对象的方法 } 当然啦!结果就如下图了: 这么赤裸裸的写出这种代码,不太容易,通常更倾向于下面一种: 2:...

    C++对象和指针的引用

    在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...

    java对象和对象的引用之间的关系

    在Java编程语言中,理解对象和对象引用之间的关系是非常重要的基础。对象是类的一个实例,而对象引用则是用于访问该对象的一种手段。下面将详细探讨这两个概念。 #### 二、对象的创建过程 在Java中,当我们创建一...

    corba 基于对象字符串的对象引用获取示例程序

    在CORBA系统中,对象引用是对象实例的唯一标识,使得客户端可以通过这个引用远程调用服务端的方法。 在CORBA中,对象字符串(Object String)是一种表示对象引用的文本形式,便于存储、传递和解析。对象字符串通常...

    对象引用与对象的区别

    ### 对象引用与对象的区别 在Java编程语言中,理解对象和对象引用之间的区别是非常重要的。这不仅是初学者经常会遇到的难点,也是深入学习面向对象编程的基础。 #### 对象的概念 对象是Java程序中的基本运行时...

    基于Python对象引用、可变性和垃圾回收详解

    在Python编程语言中,对象引用、可变性和垃圾回收是理解其内存管理机制的关键概念。首先,让我们深入了解对象引用。 对象引用是指一个变量指向内存中某个对象的位置,而不是存储对象的值。在Python中,当你创建一个...

    java对象引用

    对象引用分析图解,描述了java对象引用在栈、堆中的分布及作用。

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    对象引用、可变性和垃圾回收1

    在Python编程语言中,对象引用、可变性和垃圾回收是理解其动态特性的核心概念。首先,对象引用意味着变量实际上是对内存中对象的标签,而不是像盒子那样存储数据。当执行赋值语句时,Python会先在右侧创建或获取对象...

    基于对象引用关系图的Android恶意代码检测的研究1

    针对对象引用关系图的特性,本文对VF2算法进行了改进,添加了新参数以控制匹配精度,使得算法更适应于对象引用关系图的匹配需求。同时,分析了算法的时间复杂度和空间复杂度,以评估其实用性和效率。 【检测系统...

    PHP变量引用(&)、函数引用和对象引用_.docx

    例如,在多用户环境中,如果一个用户的脚本能够访问另一个用户的变量或对象引用,那么就可能会导致数据泄露或其他安全问题。 为了确保安全性,开发人员应该: - **限制对敏感数据的访问:** 避免将敏感数据作为引用...

    java的对象引用与对象的区别、多态性理解、向上转型和向下转型、栈和堆等综合型的知识.docx

    本文将深入探讨对象引用与对象的区别、多态性、向上转型和向下转型以及栈和堆内存的管理。 首先,让我们了解对象引用与对象的区别。对象是根据类实例化出来的实体,它们在内存中的位置通常在堆区,具有实际的数据和...

    asp.net运行提示未将对象引用设置到对象的实例错误解决方法

    在***开发中,遇到“未将对象引用设置到对象的实例”的错误是一种常见的运行时错误,通常是由对未初始化的对象进行操作所导致的。下面详细解释一些相关的知识点和解决方法。 一、网络上的一般说法 1. ViewState对象...

Global site tag (gtag.js) - Google Analytics