2013-06-04 2 views
3

Есть ли способ, чтобы перечислить все поля внутри myObject, которые ответственны за java.lang.IllegalArgumentException: Non-serializable object Exception,Как найти, какое поле отвечает за Non-Serialzable исключением

Я знаю, что это брошено objectOutputStream.writeObject(myObject);

Насколько мне известно, все ссылки на объекты внутри myObject реализуют интерфейс Serializable.

NB: myObject имеет глубокую иерархию ссылок, которая сделала бы чрезвычайно утомительным, чтобы пройти через нее и найти виновника вручную.

Редактировать: Я хочу сделать это программно.

+5

Как насчет 'myObject'? – BobTheBuilder

+0

Я думаю, вы можете увидеть его в исключении stacktrace. –

+1

показать нам exception stacktrace –

ответ

0

Если вы хотите проверить программно, какое поле экземпляра не реализует сериализуемое использование Отражение. Получите все поля этого класса. Теперь итерации через него и проверьте, является ли это экземпляром Serializable.

Try ниже though.Please игнорировать ошибки компиляции, как я не коротышка это

public static void main(String[] args) throws Exception { 
    Object o = new X(); 

    for (Field field : o.getClass().getFields()) { 
    if (!Serializable.class.isAssignableFrom(field.getType()) { 
     System.out.println("Field " + field + " is not assignable from type " + o.getClass()); 
    } 
    } 

}

Пожалуйста, обратите внимание, что вы можете пометить переменную как преходящего также, если вы не хотите сериализовать. Поэтому каждая переменная экземпляра не должна быть типом сериализации, если вы не хотите ее сериализовать.

+0

Это тот подход, который я ищу, но часть 'Serializable.TYPE', похоже, не работает. –

+0

должен быть Serializable.class. Обновлено мое сообщение. –

+0

Это совершенно неправильно. Задом наперед. Это должно быть 'Serializable.class.isAssignableFrom (field.getType())'. Вам совсем не нужно 'myType'. – EJP

0

само исключение говорит вам, какой класс не является сериализуемым.

0

Я надеюсь, что это может помочь вам в блоке поймать

catch(IllegalArgumentException e) 
{ 
Log.e("IllegalArgumentException",e.getMessage().toString()); 
} 

Они будут различать же исключение на другой линии

+0

'IllegalArgumentException' не имеет метода' getPosition() '. – EJP

0

Если сообщение об исключении не говорит вам, вы могли бы найти для него временно создавая поля transient, пока вы не получите сообщение больше.

Ключевое слово transient сообщает библиотекам сериализации не сериализовать поля, помеченные им.

Вы можете бинарно искать это, проверяя каждую половину сразу, а затем половину, пока вы ее не найдете.