Java RMI, могу ли я отправить сериализованный объект, не помещая файл класса на веб-сервер?

#java #serialization #rmi

#java #сериализация #rmi

Вопрос:

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

На самом деле, ИМХО, мне не кажется лучшим дизайном.

Комментарии:

1. Да, они должны существовать как в пути к классам сервера, так и клиента. Поскольку это не лучший дизайн, имейте в виду, что он такой же старый, как сама Java EE, и был довольно передовым для того времени. Однако во времена SOAP и веб-сервисов это своего рода пережиток.

2. Спасибо, теперь, когда вы упомянули, что он настолько старый, я понимаю, почему некоторые вещи не такие гладкие, как мне хотелось бы.

3. AFAIK, реализаций метода объекта нет в сериализованной версии объекта. Для этого вам нужно определение класса. Я полагаю, вы могли бы определить свой собственный classloader и заранее разослать определения классов для объектов, с которыми вы еще не сталкивались. Конечно, тогда вам лучше доверить своему клиенту отправлять только код, который вам удобно выполнять.

Ответ №1:

Нет. Все эти ответы неверны.

Классы не должны существовать с обеих сторон, если вы используете функцию кодовой базы RMI. Вы можете настроить веб-сервер для размещения файлов JAR и задать -Djava.rmi.server.codebase= , чтобы определить, где эти классы доступны, в виде списка URL-адресов этих файлов JAR. Вы устанавливаете это либо на сервере, либо на клиенте, либо на обоих в зависимости от того, кто будет отправлять классы, которых нет у другой стороны. Затем RMI аннотирует эти классы этими URL-адресами, чтобы цель знала, где их получить, и загружает их по мере необходимости.

Комментарии:

1. это поместит классы с обеих сторон

2. @MauricePerry Он будет динамически загружать их со стороны кодовой базы на целевую сторону. Это не то же самое, что статическое ‘put’.

3. @EJP ну, OP явно сказал, что он этого не хочет

4. @MauricePerry Он явно сказал, что не хочет «помещать сериализованные классы в CLASSPATH веб-сервера». Функция кодовой базы RMI загружает их автоматически, динамически, по требованию в виртуальную машину сервера. Это не имеет ничего общего с CLASSPATH. Следовательно, это не то, чего он «явно сказал, что не хочет».

Ответ №2:

Да, классы должны существовать с обеих сторон.

Ответ №3:

Да, файл класса также должен существовать на веб-сервере, поскольку RMI предназначался (когда-то давно) для отправки экземпляра класса по сети. Если вы просто хотите отправить данные на веб-сервер без какого-либо инкапсулирующего бизнес-поведения класса, то существуют гораздо более новые и простые способы (JSON, XML, SOAP и т.д.) Простой отправки данных.