Вы не сможете выполнить приведение в последней строке, потому что это другой класс (который не является кастуемым) - вы можете получить смутное сообщение, такое как test.SerObj is not an instance of test.SerObj
.
Это вытекает из того факта, что класс по сути является экземпляром java.lang.Class
, который критически уникален в данном загрузчике классов . Даже если вы ссылались на тот же самый файл *.class
, экземпляр SerObj
, загруженный загрузчиком классов по умолчанию, отличается от экземпляра SerObj
, загруженного clazLader
. Ни один класс не может быть приведен к другому.
Таким образом, метод не сможет вернуть SerObj
, если вам нужно использовать несколько загрузчиков классов для десериализации. (Кроме того - как это могло быть, когда два файла классов могли иметь произвольные различия?)
Один из возможных обходных путей - определить интерфейс, который определяет поведение, которое фиксируется между версиями класса. Если вы настроите временный загрузчик классов так, чтобы он мог только загружать SerObj
из файла класса oldversion и чтобы у него был правильный родительский загрузчик классов, тогда ваш старый SerObj
все равно должен реализовывать класс интерфейса как определяется корневым загрузчиком классов.
В этом случае и новый SerObj
, и старый SerObj
экземпляры можно было бы преобразовать в интерфейс SerObjIface
, и поэтому вы можете объявить свой метод для возврата , что . И на самом деле, если вы хотите, чтобы вызывающие абоненты имели дело с разными, но похожими классами (каковыми являются разные версии «одного и того же класса»), вы, возможно, должны в любом случае возвращать интерфейс для этого.