RMI-Как работает передача удаленного объекта через удаленный метод?

Насколько я понимаю, после того, как я установил канал связи RMI между двумя системами, я могу передать объект, реализующий «Remote», в один из удаленных методов, который принимает объект этого типа, и дальний конец просто получит удаленный интерфейс для нового объекта (другими словами, он станет новым удаленным соединением, а не просто сериализацией объекта).

Это правильно?

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

Это действительно трудно выразить словами. Позвольте мне попробовать это:

Допустим, у меня есть клиент и серверная система. В серверной системе я создаю и публикую объект RMI, в клиентской системе я получаю интерфейс и могу взаимодействовать с серверной системой.

Client                            Server
Object1 RemoteIface     ----   Object1 Implementation

Все идет нормально. На клиенте Object1.remoteMethod() будет выполняться на сервере (после сериализации параметров).

Теперь вопрос, на клиенте я выполняю такой код:

Object2 object2=new object2(); // Also a remote object
object1.send(object2); 

Насколько я понимаю, в этот момент в моей системе появится новый механизм связи:

Client                           Server
Object1 RemoteIface    -----    Object1 Implementation
Object2 Implementation -----    Object2 RemoteIface    

В этот момент, если сервер вызывает метод для Object2, этот метод будет фактически выполняться на клиенте.

Мне интересно, в какой момент система решает сделать это, а не просто сериализовать его (как это было бы с любым не удаленным объектом).

Или я совершенно не прав, и он просто сериализует его, и мне нужен какой-то вызов метода getRemoteInterface () для фактического создания удаленного вызова?


person Bill K    schedule 21.04.2009    source источник


Ответы (1)


Это так называемый Шаблон прокси. Объект, созданный на удаленном конце, сгенерировал код для передачи значений и активации методов.

Сам java.rmi.Remote - это просто "интерфейс тегов". Вам нужна реализация для выполнения фактической работы. Дополнительную информацию см. в этом руководстве по JavaCamp.

Обновление: хорошо, идем в другом направлении, да, вам нужно сериализовать объект и передать его по сети. Вероятно, лучше всего изучить учебник по Java по RMI первый. Но, по сути, Serializable — это еще один интерфейс тегов, который сообщает Java, что объект готов к преобразованию во внутренний строковый формат, вроде XML или YAML. Этот формат может быть «регидратирован» в соответствующий объект на принимающей стороне, пока доступны файлы классов для этого объекта.

person Charlie Martin    schedule 21.04.2009
comment
Похоже, Чарли интерпретирует ваш вопрос так же, как и я, и в своем ответе попадает точно в цель. Если вы передаете параметр (или возвращаете объект), который реализует Remote, создается динамический скелет прокси, и отправляется информация о конечной точке, относящаяся к этому скелету (вроде ссылки, а не значения). В получателе создается динамический прокси-заглушка для связи с удаленным объектом. Решение об удалении, а не сериализации, основано на интерфейсе Remote. - person erickson; 22.04.2009
comment
Хорошо, похоже, вы все правильно поняли, и я просто потратил кучу времени, переписывая свой вопрос. Но не могли бы вы более подробно остановиться на части RemoteInterface? Если я просто приведу его к удаленному интерфейсу, это приведет к тому, что он отделит интерфейс от реализации, или он должен пройти через вызов метода? - person Bill K; 22.04.2009
comment
Другими словами, что мне нужно сделать по-другому, чтобы он сериализовал весь удаленный объект поверх существующего удаленного метода, чтобы он отправлял все это, а не создавал скелет? Если бы я передал его как сериализуемый вместо удаленного, это сработало бы? - person Bill K; 22.04.2009
comment
Так что я думаю, что понимаю - это действительно в том, как это брошено. Пожалуйста, поправьте меня, если я ошибаюсь, но если у вас есть объект, который является как Serializable, так и Remote, передача его удаленному методу, который принимает Serializable, будет иметь совершенно другой эффект, чем передача его удаленному методу, который принимает удаленный аргумент. . Это имеет смысл, но кажется нелогичным, поскольку вы думаете, что простое приведение не будет иметь такого значительного эффекта. - person Bill K; 22.04.2009
comment
Ну типа. Учебники могут быть более подробными, но интерфейс — это контракт; если вы привели к Serializable, но фактически не реализовали его, вы можете получить сюрприз. В частности, у вас должен быть ctor по умолчанию, который не требует никаких аргументов. Взгляните на интерфейс javadoc: java. sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html Но да, у вас есть два варианта: Remote, который создает прокси-сервер, и Serializable, который передает копию. - person Charlie Martin; 22.04.2009
comment
Не могли бы вы взглянуть на этот вопрос? stackoverflow.com/questions/28520613/ - person ; 15.02.2015
comment
мне также нужна помощь, не могли бы вы сказать мне, что делать, на стороне клиента я звоню: obj.passFeaturesObject(features.serialize()); и на стороне сервера я получаю сообщение об ошибке при десериализации: features.deserialize(byte_array); - person Usman; 27.08.2015
comment
@BillK Если вы хотите сериализовать объект, не делайте его удаленным объектом. Если вы хотите, чтобы он оставался там, где он есть, и вызывался удаленно, сделайте его удаленным объектом. Эти вещи взаимоисключающие. - person user207421; 21.11.2016