2008-09-17 4 views
0

Я получил вызов RMI определяется как:Пасс ссылки не возвращаются в RMI для ArrayList

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

Функция выполняет поиск базы данных и заполняет два ArrayLists. Вызывающая функция ничего не получает. Я считаю, что это работает с типами 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 и следует спецификациям этого интерфейса, у вас не должно быть проблем.

Это приведет к двум раздельным вызовам по кабелю, но это намного более чистое и простое взаимодействие и позволит избежать проблемы с исправлением ссылок в вашем исходном примере.

Смежные вопросы