#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 и т.д.) Простой отправки данных.