2012-08-25 101 views
3

什么I think I know so farCORBA specification本身不允许服务器程序使用的IDL和客户端程序使用的IDL之间的任何差异。CORBA服务器和客户端的IDL之间允许有什么区别?

然而,实际上,某些差异是势必工作(美丽的)普遍,因为底层通信机制是非常可能GIOP(至少IIOP)和一定的差异也必然不经由IIOP检测的。

我喜欢建立的是,只要使用GIOP/IIOP,就可以在服务器和客户端IDL之间普遍使用任意ORB之间的差异

例如:到目前为止,我承担它的工作原理:

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

我的目标是去类似的东西,可以在现有的IDL做一个简短的清单来扩展“服务器”有新的东西,而无需重新编译退出客户提供修改后的IDL。

+2

我不认为你应该考虑这一点。它会以眼泪结束。 – EJP

+0

@ejp - 你曾经与corba合作过吗?你是IIOP专家吗? –

+0

我对计算有足够的了解,知道你不应该调情无证和未指明的行为。 – EJP

回答

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

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

  • 是的,GIOP将枚举写为无符号长整数,第一个值总是编码为零,连续标识符按照从左到右的声明顺序递增数值。因此,添加新的枚举标识是完全安全的,但不能删除而不是重新排序。

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

当然,仅仅因为缺乏谨慎而使用不匹配的IDL并不是一种好的做法,因为它也容易引入不兼容的更改。这可能仅在以下情况下才有意义:如果客户端已发布给用户,则无法再访问和更新客户端。

相关问题