BadParcelableException: ClassNotFoundException при демаршаллинге: (пустое имя класса)

У меня есть класс AllStatStruct. Этот класс содержит три атрибута, которые являются объектами моих классов StatStructCycle, StatStructHistory и MatrixStruct. Каждый класс расширяет класс DataStruct и реализует интерфейс Parcelable. В реализации интерфейса каждый класс читается и записывается с использованием readParceable() или writeParceable().

В своей деятельности я вызываю веб-сервис SOAP в AsyncTask и получаю объект класса AllStatStruct. Этот объект передается следующему действию путем создания Bundle:

protected void onPostExecute(final AllStatStruct ass) {

    if (ass != null) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        Bundle bundle = new Bundle();
        bundle.putParcelable("allStatStruct", ass);
        intent = new Intent(packageContext, PrivateView.class);
        intent.putExtras(bundle);
        startActivity(intent);

    } else {
        KreativBarometerMainView.this.showDialog(9999);
    }
}

Маршалинг посылки работает хорошо, как я могу видеть на своих выходных данных трассировки в LogCat. Но при демаршалинге посылки возникает исключение ClassNotFoundException, и я понятия не имею, почему. Это след:

05-11 15:02:59.796: E/AndroidRuntime(8647): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readParcelable(Parcel.java:1958)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct.<init>(AllStatStruct.java:45)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:70)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:1)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readParcelable(Parcel.java:1981)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readValue(Parcel.java:1846)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readMapInternal(Parcel.java:2083)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Bundle.unparcel(Bundle.java:208)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Bundle.getParcelable(Bundle.java:1100)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.ui.PrivateView.onCreate(PrivateView.java:693)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628)
05-11 15:02:59.796: E/AndroidRuntime(8647):     ... 11 more

Как видите, ненайденному классу не присвоено имя! Итак, он ищет класс с именем "" и, конечно же, не найден.

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

РЕДАКТИРОВАТЬ:

Как вы предложили, я попытался передать несколько частей AllStatStruct по отдельности. Он отлично работает с StatStructCycle и MatrixStruct, но с StatStructHistory все равно возникает ошибка.

Теперь я получаю NullPointerException, когда пытаюсь демаршалировать свой ArrayList с StatStructCycle в нем. Я прокомментировал другие части истории.

Я пытался писать и читать ArrayList с writeTypedList(List<T> list) и readTypedList(List<T> list, Creator<T> c), но он тоже не работает.

Поскольку я использую ArrayLists, я также сократил их емкость до их реального размера, используя trimToSize(), потому что я думал, что "пустые" слоты ArrayList могут вызвать проблему. Но опять же, это не так ...

Запуск приложения с отладчиком показывает, что упорядоченный StatStructHistory не имеет пустых значений ... каждый атрибут или элемент списка инициализируется. Я понятия не имею, откуда это NullPointerException.

С уважением, HTZ


person htz    schedule 11.05.2012    source источник
comment
Я решил больше не пытаться использовать пакетный интерфейс после нескольких дней непонятных результатов. Теперь я использую глобальную переменную, определенную в моем приложении, для передачи данных из одного действия в другое. Как объявить глобальную переменную?   -  person htz    schedule 13.05.2012


Ответы (1)


Проблема с немаршалингом посылок

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

В целях отладки попробуйте упорядочить каждый из ваших подобъектов один за другим. Посмотрите, не вышла ли какая-нибудь из них ошибка, а затем разберитесь в проблеме. Прямо сейчас вы пытаетесь удалить 3 объекта одновременно, и трудно определить, у какого из них возникла проблема (если таковая имеется).

Если непонятно, предлагаю попробовать следующее:

bundle.putParcelable("allStatStruct", ass.StatStructCycle); 

Если это сработает, попробуйте:

bundle.putParcelable("allStatStruct", ass.StatStructHistory); 

и т.д...

person Gophermofur    schedule 11.05.2012