Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Десериализация отсутствующего класса. Java

#java


Доброго времени суток. Столкнулся с таким интересным кейсом: Есть некое пространство(папка,
MQ-очередь, топик кафки, в общем - неважно), куда пишется в сериализованом виде Объект
Java-класса. При помощи своего листенера я слушаю это пространство. И вытаскиваю данный
объект. Есть ли возможность десериализовать или вытащить данные из объекта, при условии
что класса данного объекта у меня нет? Как минимум в виде мапы "someFieldName ==> someFieldValue".

Естественно при попытках обычной десириализации ловлю Class not Found. 
 ObjectInputStream.getFiels выдает NotActiveException.

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


Ответы

Ответ 1



Попробуй десериализовать к Object. А потом с помощью механизма рефлексии вытаскивать поля класса. Например: P p = new P(); try(ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("myStrings.data"))) { oos.writeObject(p); } catch(Exception ex) { System.out.println(ex.getMessage()); } Записал объект P. try(ObjectInputStream ois = new ObjectInputStream( new FileInputStream("myStrings.data"))) { Object someClass = ois.readObject().getClass().newInstance(); Field[] fields = someClass.getClass().getDeclaredFields(); System.out.println(fields[0].getGenericType() + " " + fields[0].getName() + " = " + fields[0].get(someClass)); } catch(Exception ex) { System.out.println(ex.getMessage()); } Получу вывод: int id = 0 Таким образом можно получить все поля данного (непонятно какого) класса. Далее можно делать с этим массивом что тебе нужно.

Комментариев нет:

Отправить комментарий