2012-02-28 2 views
0

В RMI, я могу только получить возвращаемое значение попочему Java RMI не может получить возвращаемое значение по ссылке

InetSocketAddress address = new InetSocketAddress(hostname, port); 
Server server = Stub.create(Server.class, address); 
int return = server.getValue(); 

Но я не могу получить его

public class Return { 
    int value; 
} 
InetSocketAddress address = new InetSocketAddress(hostname, port); 
Server server = Stub.create(Server.class, address); 
Return return = new Return(); 
server.getValue(return); 

Я знаю аргументы будет сериализован и десериализован, но это не мой вопрос, мой вопрос: «Почему Java не может эмулировать pass-by-reference в качестве прохода in-out, как это было сделано на C с RPC?», я думаю, что это связано к среде java. внутристрановыми, что я имею в виду C с RPC, вы можете получить возвращаемое значение по

int return; 
rpc.getValue(&return); 

Надежда теперь мой вопрос ясен.

+0

В какой класс вы называете эти методы getValue? RMI не требует, чтобы вы специально получали возвращаемое значение как отдельный шаг, вы просто вызываете методы на интерфейсе, которые возвращают результат так же, как вызов метода локально. Боюсь, я не понимаю ваш вопрос в его нынешнем виде. –

+0

@ Andrzej Doyle У меня есть модифицированный код, пожалуйста, проверьте еще раз, извините за путаницу. –

+0

«Я знаю, что аргументы будут сериализованы и десериализованы» ... * и * возвращают значения; в обоих случаях, если объект не является экспортированным удаленным объектом. Это документировано. – EJP

ответ

4

Возврат дополнительных прокси объектов вызовет проблему реализации. Как бы то ни было, существует только один способ создания удаленного объекта. если методам разрешено создавать более удаленные объекты, просто возвращая обычные объекты, тогда все эти вызовы должны быть перехвачены, объекты правильно каталогизированы и т. д.

Другими словами, люди Java - в отличие от, например, г. Люди DCOM - решили не делать дополнительную сантехнику. И это всегда будет ответом на вопрос «почему система A отличается от системы B».

1

Ссылка - это адрес памяти на вашем компьютере. С RMI вы пытаетесь передать этот адрес памяти (потенциально) на другой компьютер, где этот адрес памяти не будет иметь смысла в этом контексте. Другая машина не будет теперь, как интерпретировать этот адрес. Вот почему значения могут быть переданы.

+0

Спасибо, но, как я уже сказал, в RPC это может быть достигнуто, после вызова функции значения будут «писать обратно» в ссылочную переменную, насколько я знаю. –

+0

Я не согласен. Ссылка - это способ обращения к объекту. Он может быть реализован прямо с использованием адреса памяти объекта (например, кучи C++), но может также быть реализован как путь '/ machineX/objectstore/socketxyz' или непрозрачный целочисленный идентификатор объекта. Все эти ссылки могут быть переданы другим машинам. – xtofl

0

Когда вы передаете аргументы методу «передать по ссылке», вы передаете ссылку, что невозможно в удаленных вызовах. И помните, что Java поддерживает только пропуск по значениям (даже ссылки на объекты).

Вы можете сказать, что во время выполнения RMI может десериализации все аргументы обратно клиенту, но это будет проблема:

Предположим, у вас есть длинный в качестве аргумента, так что Java Runtime будет сериализовать его на сервер, а затем что? Должен ли он десериализировать его? помните, что Длинны неизменны.

Если Java runtime создает еще один экземпляр Long, то как он может обновлять все экземпляры, ссылающиеся на старый Long (который был передан как аргумент)?

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