Java RMI, делающий объект сериализуемым И удаленным - PullRequest
2 голосов
/ 07 июня 2011

Вы можете подумать, зачем вам нужен объект, как удаленный, так и сериализуемый. Хорошо, позвольте мне дать вам некоторый контекст.

Я строю систему управления воздушным движением (школьный проект), она распределена так, что каждая зона управления работает на своем собственном сервере и связывается с другими зонами управления. Каждая контрольная зона отслеживает свои собственные самолеты.

Когда самолет (летящий в контрольной зоне A) находится в 100 км от своей границы, он передается как удаленный объект в контрольную зону (контрольную зону B), рядом с которой он находится. Таким образом, контрольная зона B может видеть, где находится самолет (периодически спрашивая его положение), пока он все еще контролируется контрольной зоной A.

Но когда самолет пересекает границу между контрольной зоной A и B, контрольная зона B должна отслеживать самолет, а не контрольную зону A. Поэтому мы хотим сериализовать самолет и передать его в контрольную зону B. В этом наша проблема ,

Могу ли я сделать самолет удаленным и сериализуемым?

РЕДАКТИРОВАТЬ: Кроме того, я мог бы использовать удаленные методы для копирования необходимых полей для самолета, но я предпочитаю его сериализацию.

Ответы [ 4 ]

3 голосов
/ 08 июня 2011

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

2 голосов
/ 12 августа 2011

Вам не нужно делать свой объект подклассом UnicastRemoteObject.

Возьмите свой класс, определите его для реализации Serializable и вашего интерфейса API RMI, который сам должен реализовать Remote.Ему не нужно создавать подклассы, кроме java.lang.Object.

Когда вы будете готовы к удаленному вызову вашего объекта, вызовите статический метод UnicastRemoteObject.exportObject () для него.С этого момента любая ссылка, которую вы возвращаете через RMI на этот объект, будет вызываться удаленно.

Если вы хотите передать объект другому серверу, вызовите UnicastRemoteObject.unexportObject () для вашего объекта.Затем, когда вы передадите его через вызов RMI, вы передадите сериализованное представление этого объекта.

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

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

Когда вы хотите передать базовый объект с сериализацией, вы передаете егонепосредственно.Если вы хотите передать удаленно вызываемую ссылку на него, вы передаете прокси.

1 голос
/ 07 июня 2011

Взгляните на UnicastRemoteObject класс.Обычно он используется для программирования с использованием обратного вызова в RMI и, следовательно, реализует как Remote, так и Serializable.Хотя, возможно, вы захотите пересмотреть свою логику, поскольку теперь у вас есть объект (самолет), который действует как «удаленный сервер».

0 голосов
/ 07 июня 2011

Оказывается, это решение не было правильным.См. Ответ @ EJP ниже, чтобы узнать, как это сделать с одним экземпляром.

...