2012-08-25 97 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並不是一種好的做法,因爲它也容易引入不兼容的更改。這可能僅在以下情況下才有意義:如果客戶端已發佈給用戶,則無法再訪問和更新客戶端。

相關問題