2016-10-05 2 views
2

У меня есть следующий класс:Странный ClassCastException при вызове Intent.getSerializableExtra()

public class IdList extends ArrayList<Long> { 

    public IdList() { 
     super(); 
    } 

    public IdList(Collection<Long> idCollection) { 
     super(idCollection); 
    } 
} 

я передать экземпляр этого класса к IntentService со следующим кодом:

final Intent intent = new Intent(this, MyService.class); 
intent.putExtra(MyService.IDS, ids); 
startService(intent); 

И я использую следующий код, чтобы принести его в Service:

IdList ids = (IdList) intent.getSerializableExtra(IDS); 

Какие приводит к следующему ClassCastException:

java.lang.ClassCastException: java.util.ArrayList не может быть приведен к my.package.IdList

НО

Отправка объекта тот же тип (IdList) от Service с использованием LocalBroadcastManager и выборки его в onReceive() (по тому же методу, позвонив по телефону getSerializableExtra() по телефону Intent и литье до IdList) работает безупречно.

No ClassCastException выброшено.

Почему это происходит? Это ошибка в Android?

EDIT:

Я использую следующий метод для создания экземпляра моего IdList объекта:

public IdList getIds() { 
    return selectedIds.isEmpty() ? null : new IdList(selectedIds); 
} 

selectedIds является HashSet<Long> объектом.

EDIT2:

Я не ищу обходные пути. Я хотел бы знать, почему тот же код работает отлично, когда Intent отправляется по широковещательной передаче и почему он бросает ClassCastException, когда он передается по вызову startService().

+0

Как вы создаете экземпляр 'ids' перед вызовом' intent.putExtra (MyService.IDS, ids); '? – gus27

+0

Пожалуйста, покажите свой код для создания экземпляра переменной 'ids'. – gus27

+0

Есть хорошая статья о вашей проблеме: [Таинственный случай Связки и Карта] (https://medium.com/the-wtf-files/the-mysterious-case-of-the-bundle-and-the -map-7b15279a794e # .l9yencapv) - также должен работать и для ArrayLists ;-) Это объясняет проблему и предлагает обходной путь. – gus27

ответ

0

Я бы не рекомендовал использовать сериализации .. использовать Parcelable вместо этого

Сделайте свой класс список_идентификаторов Parcelable, то вы можете получить поместить/получить ваш объект

intent.putParcelableArrayList(ids); 

IdList ids = (IdList) intent.getParcelableArrayListExtra(IDS); 

Я надеюсь, что может помочь» ,

+0

Спасибо за ваш ответ, но я знаю о возможных обходных решениях. Я не ищу обходного пути, но спрашиваю, почему проблема, описанная в моем вопросе, происходит. – justanoob

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