У меня есть следующий сценарий:Десериализация к типу интерфейса возвращает нуль
Interface A{
}
Class X implements A, Serializable{
}
Программа P1 знает как A
и X
и сериализующий объект objX
класса X
в массив байтов byAX
.
Затем P1 отправляет byAX
в программу P2 через промежуточное программное обеспечение.
P2 только знает интерфейс A
. Поэтому он десериализует byAX
объекту типа A
. Проблема в том, что эта операция возвращает NULL
.
сериализации в P1 реализуется следующим образом:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(objX);
byte[] byAX = bos.toByteArray();
...
десериализации в P2 реализована следующим образом:
ByteArrayInputStream bis = new ByteArrayInputStream(byAX);
ObjectInput in = new ObjectInputStream(bis);
A objA = (A) in.readObject();
objA
Объект получает NULL
после строки A objA = (A) in.readObject();
Не может Я десериализую тип интерфейса?
Где моя ошибка?
Спасибо большое,
Гильерме
Основываясь на ваших определениях, 'A' не является расширением' Serializable'. Он также нуждается в конкретном классе для десериализации. Вы не можете напрямую создавать интерфейс. – Krease
Как вы ожидаете, что программа превратит дамп внутреннего состояния в объект, если у него нет соответствующего определения класса? – chrylis
Чтобы добавить к ответу Криса, я уверен, что вы можете только десериализовать то же определение класса, которое вы использовали для сериализации. Он должен иметь одинаковые элементы и методы. Код метода не должен совпадать, и * некоторые * изменения могут быть обработаны автоматически, например, добавление новых полей в класс. – Jamie