Как десериализовать скрытый за объектом класса ServiceProvider в Java?

Мы создаем программу, которая строит логические схемы и использует механизмы Lookup и ServiceProvider платформы NetBeans для получения всех доступных логических элементов на палитре пользовательского интерфейса.

Модель (MVC) имеет класс BasicElement, который является ServiceProvider всех элементов. Этот класс общедоступен, его пакет публично экспортируется, и модуль View зависит от него. Модуль View знает только об этом модуле Model. Когда кто-то добавляет новый модуль с набором элементов, аннотированных с помощью @ServiceProvider, View загружает в палитру новые элементы, найденные с помощью Lookup. Затем пользователь может добавить элементы из палитры на сцену, создать несколько схем и сохранить (сериализовать) их.

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

Есть ли возможность без каждый раз добавления зависимости от новых модулей с элементами десериализации тех. Или вообще есть способ десериализовать объекты класса, которые скрыты за классом ServiceProvider.


person imy    schedule 26.04.2012    source источник


Ответы (1)


Я столкнулся с этой точной проблемой некоторое время назад. После долгих исследований я обнаружил, что вы можете изменить загрузчик классов, используемый ObjectInputStream. Взгляните на мой пост в блоге по теме, подробно описывающей мое решение. http://www.pellissier.co.za/hermien/?p=179

person hermien.pellissier    schedule 13.12.2012
comment
Просто к вашему сведению, было бы лучше перенести решение в сам ответ. - person Mike G; 13.12.2012