Unmarshalling ошибки в приложении Android с настраиваемыми классными классами

Для моего приложения для Android я получаю несколько ошибок, не Parcelable с Parcelable хотя я думаю, что сделал все, что необходимо для правильного сохранения и загрузки объектов через Parcelable s. Не могли бы вы рассказать мне, что случилось с моим кодом?

Ошибка 1:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@41279860: Unmarshalling unknown type code 6619241 at offset 1372 at android.os.Parcel.readValue(Parcel.java:1922) at android.os.Parcel.readMapInternal(Parcel.java:2094) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getParcelable(Bundle.java:1158) at android.app.Activity.onCreate(Activity.java:860) at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012) at android.app.Activity.performCreate(Activity.java:4465) 

Строка 1012 в MyActivity – это вызов super.onCreate(savedInstanceState); В onCreate() .

 protected void onSaveInstanceState(Bundle savedInstanceState) { if (myObject == null) { savedInstanceState.putParcelable("myObject", null); } else { savedInstanceState.putParcelable("myObject", myObject); } savedInstanceState.putInt(...); savedInstanceState.putString(...); savedInstanceState.putBoolean(...); super.onSaveInstanceState(savedInstanceState); } 

MyObject имеет класс MyObject который имеет следующие методы:

 public void writeToParcel(Parcel out, int flags) { out.writeIntArray(...); out.writeInt(...); out.writeStringArray(...); out.writeString(...); out.writeParcelableArray(..., flags); } public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() { public MyObject createFromParcel(Parcel in) { try { if (in == null) { return null; } else { return new MyObject(in); } } catch (Exception e) { return null; } } public MyObject[] newArray(int size) { return new MyObject[size]; } }; private MyObject(Parcel in) { in.readIntArray(...); ... = in.readInt(); in.readStringArray(...); ... = in.readString(); ... = (OtherObject[]) in.readParcelableArray(OtherObject.class.getClassLoader()); } 

Ошибка 2:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: at android.os.Parcel.readParcelable(Parcel.java:1971) at android.os.Parcel.readValue(Parcel.java:1859) at android.os.Parcel.readMapInternal(Parcel.java:2099) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getParcelable(Bundle.java:1158) at android.app.Activity.onCreate(Activity.java:905) at my.app.package.PlayComputer.onCreate(SourceFile:1012) 

Те же файлы и классы.

Ошибка 3:

 java.lang.RuntimeException: Unable to start activity ComponentInfo Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4051aff8: Unmarshalling unknown type code 7340149 at offset 1276 at android.os.Parcel.readValue(Parcel.java:1913) at android.os.Parcel.readMapInternal(Parcel.java:2083) at android.os.Bundle.unparcel(Bundle.java:208) at android.os.Bundle.getParcelable(Bundle.java:1100) at my.app.package.PlayComputer.onCreate(SourceFile:1111) 

На этот раз вызывающая строка (1111) следующая:

 myObject = (MyObject) savedInstanceState.getParcelable("myObject"); 

Solutions Collecting From Web of "Unmarshalling ошибки в приложении Android с настраиваемыми классными классами"

Android имеет два разных загрузчика классов: класс classloader (который знает, как загружать классы Android) и загрузчик классов APK (который знает, как загрузить ваш код). У загрузчика классов APK установлен класс загрузчика классов как его родительский элемент, то есть он также может загружать классы Android.

Ошибка № 2, скорее всего, вызвана Bundle с использованием класса classloader, поэтому он не знает ваших классов. Я думаю, что это может произойти, когда Android необходимо сохранить ваш Bundle, а затем восстановить его (например, при нехватке памяти в фоновом режиме). Вы можете исправить это, установив загрузчик классов APK в комплекте:

savedInstanceState.setClassLoader (GetClass () getClassLoader ().);

Ошибка №1 и №3 более загадочна, возможно, вы пишете нулевые значения в writeToParcel() ? Боюсь, Android этого не очень нравится.

По внешнему виду, createFromParcel и newArray должны быть переопределены следующим образом:

 public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() { @Override public MyObject createFromParcel(Parcel in) { MyObject myObj = new MyObject(); myObj.intArray = in.readIntArray(...); myObj.intValue = in.readInt(...); // .... // IN THE SAME ORDER THAT IS WRITTEN OUT AS PER writeToParcel! // return myObj; } @Override public MyObject[] newArray(int size) { return new MyObject[size]; } }; 

Редактировать:

Я забыл упомянуть, что для того, чтобы это работало, должен был быть пустой конструктор!

 public MyObject(){} 

Перед чтением из набора пакетов ClassLoader

bundle.setClassLoader (GetClass () getClassLoader ().);

Это спасло мое время!