2014-11-19 4 views
0

Я работаю с плагинами OSGi, и у меня возникают проблемы с десериализацией.Проблема десериализации в OSGi

Скажем, есть два плагина A и B. Плагин A является общим и будет использоваться во многих приложениях, в то время как плагин B относится только к одному приложению. Плагин A в основном является основой для всех приложений. Плагин B использует API плагина A для сохранения информации о состоянии. Таким образом, плагин B зависит от A, но A не зависит от B.

Чтобы сделать его простым, предположим, что я храню информацию в HashMap плагина A. Класс X, который реализует Serializable, присутствует внутри плагина B. Плагин A сериализует его и сохраняет. Во время процесса десериализации плагин А не может найти класс X, и он терпит неудачу. Я не могу добавить класс X в плагин A, поскольку плагин A является общим и не имеет смысла в A.

Класс X доступен во время работы. Каков правильный и чистый способ решения этой проблемы?

Заранее спасибо.

ответ

1

Звучит как плагин A - это кэш. Плагин A должен быть разработан таким образом, что во время инициализации (или во время каждого запроса) может быть передан классLoader. Если он не разработан таким образом, он не является OSGi дружественным и не должен использоваться в среде OSGi.

E.gC .: EHCache, Infinispan и другие механизмы кэширования позволяют передавать экземпляр Classloader во время инициализации кеша.

+0

Это нетривиальная, чтобы получить API, который не ClassLoader известно для расслоения B, но я думаю, что это может быть возможным благодаря реализации кэша в качестве службы завода а затем создание нового экземпляра службы для каждого пакета * X *, запрашивающего кеш. Завод-изготовитель получает ссылку на каждый Bundle, запрашивающий услугу, поэтому вы можете обернуть «loadClass» Bundle в свой собственный ClassLoader impl, который затем перейдет к EHCache. – JBert