Загрузка сериализованных классов - PullRequest
2 голосов
/ 24 августа 2011

Какой самый простой способ загрузить класс, сериализованный с использованием стандартного API-интерфейса Java Serialization?

Существуют ли какие-либо тривиальные отношения между форматом .class и сериализованной формой экземпляра Class<?>?

Ответы [ 3 ]

1 голос
/ 24 августа 2011

Существуют ли тривиальные отношения между форматом .class и сериализованная форма экземпляра класса?

Сериализуемый класс при компиляции получает идентификатор с именем serialVersionUID ( SUID ). Каждый объект, сериализованный с использованием этой версии класса, также помечается этим SUID.

Какой самый простой способ загрузить класс, который был сериализован с использованием стандартный API сериализации Java?

Зависит от того, чего вы пытаетесь достичь, файл * .class, как вы уже знаете, состоит из байтового кода в виде серии байтов. Объекты не реплицируют байтовые коды, поэтому вы не можете восстановить серию байтов этого класса из сериализованного объекта. Но у вас есть serialVersionUID как последняя длинная переменная в сериализованном объекте. Используя эту информацию, вы можете сопоставить соответствующую версию * .class.

Но это больше сказано, чем сделано, вы натолкнетесь на множество интересных вещей, фактически реализуя эту «адаптивную» загрузку.

1 голос
/ 24 августа 2011

Если вы спрашиваете, можете ли вы сериализовать объект Class<?>, а затем использовать этот сериализованный файл как файл .class для загрузки в ClassLoader, тогда ответ - нет.

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

0 голосов
/ 24 августа 2011

Что нужно сделать, чтобы прочитать файл класса и преобразовать его в байт [] и записать их в файл.

Тогда при удалении данных вам потребуется загрузить байт [] из файлов и определить класс по умолчанию, как системный загрузчик классов или самоопределяемый загрузчик классов, в зависимости от ваших потребностей.

...