ClassNotFoundException при разборке Parcelable

У меня проблема с разбором Parcelable через Intent.

Я создаю посылки, используя

Intent data = new Intent();
data.putExtra(ShoppingListAdapter.parcelName, la);
setResult(Activity.RESULT_OK, data);

Я получаю его в onActivityResult:

Parcelable myData = data.getParcelableExtra(ShoppingListAdapter.parcelName);

Затем передайте его другому действию, используя:

Intent myIntent = new Intent(this,Class.class);
myIntent.putExtra("myData", myData);
startActivityForResult(myIntent, RESULT);

У моего Parcelable есть еще один Parcelable, внутри которого я пишу и читаю uisng:

list = in.readParcelable(null);

Я пытался использовать разные загрузчики классов, от ClassLoader.getSystemLoader() до MyClass.class.getClassLoader(), но все равно получаю исключение времени выполнения:

06-12 21:13:04.940: ERROR/AndroidRuntime(29962): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 

Моя посылка испорчена где-то до этого или я неправильно читаю?

Алекс


person Alex    schedule 12.06.2011    source источник
comment
В результате вы пытаетесь вернуть реализацию ListAdapter? (Имя переменной la кажется мне подозрительным. :))   -  person Ted Hopp    schedule 13.06.2011
comment
Ну да и нет. Я возвращаю данные, хранящиеся в адаптере. Таким образом, он сглаживает различные биты данных внутри yes. Это работает для изменения конфигурации, когда я делаю то же самое, но я вставляю его в сохраненный экземпляр вместо Intent. Это проблема? Я думал, что просто сглаживаю данные внутри, вот и все.   -  person Alex    schedule 13.06.2011


Ответы (3)


У меня тоже была такая проблема, это глупо. Порядок и количество методов для writeToParcel и readToParcel должны быть одинаковыми и с одинаковыми переменными.

Я имею в виду:

public void writeToParcel(Parcel dest, int flags) {
   dest.writeString(title);
   dest.writeParcelable((Parcelable)this.getLocation(), flags);
   dest.writeString(value);  
}

должны быть в том же порядке, что и:

private void readFromParcel(Parcel in){

  this.setTitle(in.readString());
  this.setLocation((Location)in.readParcelable(android.location.Location.class.getClassLoader()));
  this.setValue(in.readString());
}
person user2081479    schedule 07.05.2013
comment
Спасибо, я уже собирался разозлиться. - person Lazy; 02.09.2015

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

Как объявить глобальные переменные в Android?

Хотя, если у кого-то есть идеи для ответа на исходный вопрос, пожалуйста, напишите. Может случиться где-то еще с кем-то еще.

Алекс

person Alex    schedule 14.06.2011
comment
Это происходит в моем коде. Все выглядит нормально, но при чтении вылетает... - person Ronnie; 18.09.2012

Intent.setExtrasClassLoader(java.lang. ClassLoader) помочь?

person Tavian Barnes    schedule 22.08.2012