2008-09-17 46 views
0

我有定義爲RMI電話:通過引用傳遞在RMI不返回的ArrayList中

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException; 

的功能做一個數據庫查詢,並填充兩個的ArrayList。調用函數什麼也沒有。我相信這適用於Vector類型。

我是否需要使用Vector,或者有沒有辦法讓這個工作沒有進行兩個調用。我可能會使用其他一些想法,比如返回一個鍵/值對,但我想知道我是否可以實現這一點。

更新:
如果可以的話,我會接受所有給出的答案。我不知道網絡成本,所以重寫函數返回一個LinkedHashMap而不是兩個ArrayLists是有意義的。

回答

1

正如湯姆提到的,你可以傳遞遠程對象。您必須創建一個類來保存實現Remote的列表。只要接收方使用它,任何時候你都會傳遞一個實現Remote的東西,它會轉向,並向調用者發送遠程調用返回以使用該對象。

1

當您進行遠程通話時,您將失去參考。您需要返回列表,而不是期望它們被遠程調用填充。

2

RMI中的參數調用序列化的。服務器上的反序列化創建列表的副本。如果列表保留在客戶端,則網絡呼叫的數量將會非常高。您可以傳遞遠程對象,但要注意性能影響。

1

正如其他人已經提到的,傳遞對象作爲參數時到RMI方法,該對象將得到初始化,然後反序列化在含有RMI方法的目標對象內的另一端。這會中斷傳入的原始對象的引用,因爲您現在有兩個不同的對象:一個在調用方法的客戶端代碼中,另一個在遠程端。

在這個特定的例子中,一個更好的方法是打破你的方法調用(因爲你似乎在一個方法中做兩件事:獲取客戶名稱和獲取客戶編號),並將結果返回給調用者而不是傳遞一個集合中......這樣的:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException; 

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException; 

由於兩個ArrayList和字符串實現Serializable,集合中的結果將被序列化,並通過線路發送到客戶端代碼中調用該方法,在這點你可以使用你需要的數據。相反,如果您需要在集合中使用自定義對象,只要您的類實現了java.io.Serializable接口,並遵循該接口的規範,則應該沒有問題。

這將導致在導線兩個單獨的呼叫,但它是一個更清潔和更簡單的互動,避免了參考原來的例子突破的問題。