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

226
18 апреля 2018, 09:16

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

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

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

Answer 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

Таким образом можно получить все поля данного (непонятно какого) класса. Далее можно делать с этим массивом что тебе нужно.

READ ALSO
Как импортить внешние таблицы (или базу данных) в имеющуюся бд

Как импортить внешние таблицы (или базу данных) в имеющуюся бд

Суть вопроса такова: У меня уже есть таблица, к примеру, "Использование авто в такси"По проекту мне необходимо сравнить внешнюю таблицу (или...

185
Создание нескольких таблиц JTable по нажатию одной кнопки

Создание нескольких таблиц JTable по нажатию одной кнопки

Добрый день! Подскажите, пожалуйста, в моей программе есть кнопка, по нажатию которой создается таблица (JTable) во вкладке, вкладке присваивается...

278
Поочередный вызов сервисов из одного docker-compose файла

Поочередный вызов сервисов из одного docker-compose файла

Подскажите пожалуйста, у меня имеется один docker-compose файлВ нём есть 2 тестовых сервиса и 2 рабочих

273
Как создать динамический массив fragment -ов?

Как создать динамический массив fragment -ов?

Делаю Navigation drawer внутри него RecyclerView необходимо по клику по item-y RcyclerView открывать новый фрагмент

217