Эквивалент ObjectOutputStream, сохранение не только его состояния, но и всего объекта? - PullRequest
5 голосов
/ 09 мая 2011

Я разрешаю пользователю импортировать плагинообразные классы из удаленного местоположения с помощью URLClassLoader, поэтому эти импортированные классы НЕ существуют в пути сборки (однако все они реализуют интерфейс IPlugin , который включен ).

Я предположил, что можно просто использовать ObjectOutputStream, чтобы сохранить все загруженные плагины в файл, а затем прочитать их с помощью ObjectInputStream. Однако, похоже, это не так, поскольку все, что он сохраняет, - это состояние объекта, а не содержащая его логика (то есть методы).

Я надеюсь сохранить список загруженных плагинов (activePlugins) с ObjectOutputStream:

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();

Затем в другой среде выполнения загрузите / восстановите все эти плагины с помощью ObjectInputStream:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();

Но поскольку действительные классы объектов недоступны в пути сборки (они находятся где-то еще на жестком диске), он становится бесполезным. Мне нужен какой-то способ загрузки объектов без наличия классов, то есть загрузка объектов с состояниями и без зависимостей.

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

вам нужен собственный загрузчик классов.вы в основном хотите что-то похожее на URLClassLoader, но с возможностью загружать и кэшировать банки локально.Возможно, вы захотите взглянуть на расширение URLClassLoader или реализацию чего-то похожего на него.в основном вам нужно просто подключиться к той части, куда загружен jar-файл, и вставить его куда-нибудь локально (или загрузить его из этого кэшированного места, если вы уже загрузили его ранее).

1 голос
/ 09 мая 2011

Посмотрите на RMI. Это расширяет сериализацию с помощью механизма передачи классов, так что вы можете сериализовать и десериализовывать объекты (в приемнике) неизвестных классов в скважине и выполнять их методы.

Думаю, это делается с помощью некоторого механизма загрузки удаленных классов.

0 голосов
/ 09 мая 2011

Хотя Java не является моей основной средой программирования, я видел ту же проблему в других «средах», таких как PHP, Delphi и C #.

Одно из решений - объявить файлы классов и пути.

Другое предложение заключается в том, что, поскольку вы указали, вас не заботит только состояние логики («данные»), вы можете объявить универсальный класс, в котором хранится значение свойств.

...