2014-10-15 5 views
0

У меня есть следующий сценарий:Десериализация к типу интерфейса возвращает нуль

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();

Не может Я десериализую тип интерфейса?

Где моя ошибка?

Спасибо большое,

Гильерме

+2

Основываясь на ваших определениях, 'A' не является расширением' Serializable'. Он также нуждается в конкретном классе для десериализации. Вы не можете напрямую создавать интерфейс. – Krease

+0

Как вы ожидаете, что программа превратит дамп внутреннего состояния в объект, если у него нет соответствующего определения класса? – chrylis

+0

Чтобы добавить к ответу Криса, я уверен, что вы можете только десериализовать то же определение класса, которое вы использовали для сериализации. Он должен иметь одинаковые элементы и методы. Код метода не должен совпадать, и * некоторые * изменения могут быть обработаны автоматически, например, добавление новых полей в класс. – Jamie

ответ

0

Если readObject() возвращается нуль, вы прошли нуль в writeObject().

Настоящая причина может заключаться в том, что readObject() выбрал исключение , которое ваш код игнорировал и вместо него возвращал null. В этом случае вам нужно отладить исключение. Не игнорируйте это.

Смежные вопросы