
2.3.
Обращение к удаленным объектам 125
шения вызова. Для этого, как уже говорилось, заместитель нуждается в сетевом
адресе и конечной точке сервера.
Таким образом, заместитель обладает всей информацией, необходимой для
обращения клиента к методу удаленного объекта. В Java заместители сериали-
зуются. Другими словами, заместитель можно подвергнуть маршалингу и пере-
слать в виде набора байтов другому процессу, в котором он может быть подвергнут
обратной операции (демаршалингу) и использован для обращения к методам
удаленного объекта. Косвенным результатом этого является тот факт, что замес-
титель может быть использован в качестве ссылки на удаленный объект.
Этот подход согласуется с методами интеграции локальных и распределен-
ных приложений в Java. Напомним, что при обращении RMI локальный объект
передается путем создания копии, а удаленный
—
через общесистемную ссылку
на объект. Заместитель представляет собой просто-напросто локальный объект.
Это означает, что сериализуемый заместитель можно передавать по сети как па-
раметр RMI. В результате появляется возможность использовать заместитель как
ссылку на удаленный объект.
В принципе nppi маршалинге заместР1теля вся его реализация, то есть его со-
стояние и код, превращаются в последовательность байтов. Маршалинг подоб-
ного кода не слишком эффектршен и может привести к слишком объемным
ссылкам. Поэтому при маршалинге заместителя
в
Java на самом деле происходит
генерация дескриптора реализации, точно определяющего, какие классы необхо-
димы для создания заместителя. Возможно, некоторые из этих классов придется
сперва загрузить из удаленного узла. Дескриптор реализации в качестве части
ссылки на удаленный объект заменяет передаваемый при маршалинге код. В ре-
зультате ссылки на удаленные объекты
в
Java имеют размер порядка нескольких
сотен байт.
Такой подход к ссылкам на удаленные объекты отличается высокой гиб-
костью и представляет собой одну из отличительных особенностей RMI в Java
[482].
В частности, это позволяет оптимизировать решение под конкретный объ-
ект. Так, рассмотрим удаленный объект, состояние которого изменяется только
один раз. Мы можем превратить этот объект в настоящий распределенный объ-
ект путем копирования в процессе привязки всего его состояния на клиентскую
машину. Каждый раз nppi обращении клиента к методу он работает с локальной
копией. Чтобы гарантировать согласованность данных, каждое обращение про-
веряет, не изменилось ли состояние объекта на сервере, и при необходимости об-
новляет локальную копию. Таким же образом методы, изменяющие состояние
объекта, передаются на сервер. Разработчик удаленного объекта должен разрабо-
тать только код, необходимый для клиента, и сделать его динамически подгру-
жаемым при присоединении клиента к объекту.
Возможность передавать заместителя в виде параметра существует только
в том случае, если все процессы работают под управлением одной и той же вир-
туальнор! машины. Другими словами, каждый процесс работает в одной и той же
среде исполнения. Переданный при маршалинге заместитель просто подвергает-
ся демаршалингу на приемной стороне, после чего полученный код заместителя
можно выполнять. В противоположность этому в DCE, например, передача за-