Расширил сериализуемый класс, как использовать в удаленных вызовах?

#java #javabeans #serializable

#java — язык #javabeans #сериализуемый #java

Вопрос:

Вот моя ситуация:

У меня есть серверное приложение, предоставляющее удаленный интерфейс, который использует объекты bean в качестве параметров вызова / возвращаемых значений. Они, конечно, сериализуемы. Например, врач, который работает в хирургии.

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

Какой самый простой способ для меня сейчас использовать объекты моих расширенных реализаций при удаленном вызове на сервер? Сервер, очевидно, не может реконструировать мои сериализованные реализации, потому что он не знает моих специализированных классов.

Должен ли я вручную создавать нерасширенный объект bean из моего расширенного объекта, в основном копируя все поля, кроме новых? или есть лучший / более простой способ сделать это? Перезапись методов сериализации — это не вариант, потому что, как я уже говорил выше, мне все еще нужно, чтобы мои локальные объекты также были нормально сериализуемыми.

Ответ №1:

Сервер, очевидно, не может реконструировать мои сериализованные реализации, потому что он не знает моих специализированных классов.

Если ваш сервер не сможет узнать о ваших специализированных классах через jar в classpath, вы не сможете заставить его отменить сериализацию ваших классов.

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

Более простым решением является использование корневого класса для ваших компонентов, содержащего или расширяющего хэш-карту и сохраняющего в ней свойства / значения. Вместо того, чтобы создавать getter и setter для каждого свойства, реализуйте только одну пару и предоставляйте имя свойства в виде строки.

У сервера не возникнет проблем с его отменой сериализации, если только один из сериализуемых объектов на карте не неизвестен серверу. Этот метод позволяет добавлять в него любую дополнительную информацию о компонентах, и сервер всегда будет знать, как с этим справиться.

Вы могли бы попробовать и более сложный подход. Класс Class сериализуем сам по себе. Следовательно, если вы перенесли его до того, как передали свои компоненты, возможно, сервер мог бы узнать об этом первым. Я никогда не пробовал это сам, поэтому не знаю, сработает ли это. Просто идея.

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

1. Прокси не выглядят так, как будто они будут работать для этого. что касается свойств хэш-карты: суть в том, что часть этой информации в специализированной версии должна храниться в секрете и вообще не передаваться при удаленном вызове. проблема не только в том, что сервер не может восстановить объекты. я думаю, я просто буду придерживаться набора методов export (), которые клонируют каждый объект в экземпляр соответствующего супертипа.

2. В этом случае конструкторы копирования являются самыми простыми.