CORBA服务器的IDL和客户端之间允许有什么区别?

时间:2012-08-25 11:47:35

标签: interop corba idl iiop

I think I know so far CORBA specification是什么answered with yes here.不允许服务器程序使用的IDL与客户端程序使用的IDL之间存在任何差异。

但是,在实践中,某些差异绑定到工作(非常)普遍,因为底层的通信机制很可能是GIOP(至少是IIOP)和一些差异必然无法通过IIOP检测到。

我想要建立的是只要使用GIOP / IIOP,服务器和客户端IDL之间允许在任意ORB之间存在差异。

例如:到目前为止,我假设它适用于:

  • 将任何类型/接口添加到服务器IDL,只要客户端IDL知道的类型未被触及或任何未知的新类型发送回客户端。
  • 将方法添加到服务器端的现有接口 - 客户端应该能够使用此接口继续调用对象,即使他的IDL没有列出所述方法。 (这似乎是Add a member to a union
  • 将成员添加到枚举的 end ,只要客户端永远不会看到此新值。
  • {{3}},只要客户端永远不会看到此Union类型,并将鉴别器设置为新值。

我的目标是为了获得类似于现有IDL中可以做的事情的简短列表,用新东西扩展“服务器”,而不必使用修改后的IDL重新编译现有客户端。

1 个答案:

答案 0 :(得分:1)

  • 是的,服务器和客户端方法集不需要完全匹配,因为方法是通过名称(GIOP消息中的操作字段)访问的,并且是独立的。换句话说,GIOP调用将方法名称包括为字符串,稍后参数将按此参数的预期进行编码。请参阅CORBA tieCORBA stub的示例。

  • 是的,如果您创建并导出新界面,它只是一个新界面。它可以独立于其他名称服务绑定到任何名称服务,而不知道这个新接口的客户端将无法使用它。将能够使用绑定到同一名称服务的已知类型。

  • 是的,GIOP将枚举写为无符号长整数,第一个值始终编码为零,连续标识符按升序数字值,按从左到右的顺序排列。因此,附加新的枚举标识是完全安全的,但不能删除而不是重新排序。

阅读GIOP specification,帮助很多。查看由IDL编译器生成的代码以及在IDL中更改内容时它如何更改也非常好。

当然,仅仅因为缺乏关注而使用不匹配的IDL并不是一个好习惯,因为它也很容易引入不兼容的更改。这有任何意义,可能只有在您无法再访问并更新已发布给用户的客户端的情况下。