ClassCastException - Parcelable объекты/Пользовательский объект

я искал дни здесь в поисках решения, но я не могу его найти. У меня есть действие, которое отправляет объект через действия. Но, когда начинается "readParcelable", после нескольких объектов появляется CastExceptionError, я несколько раз отлаживал этот код, пробовал заменять объекты, комментировать объекты, ничего не работает. Вот код: Все классы реализуют методы Parcelable, writeToParcel, readFromParcel и CREATOR.

@Override
public void onClick(View v) {
       carregaDados();
       Intent myIntent = new Intent(ctx, Activity_VendaProduto.class);
       if (!logradouro.getText().toString().equals("")) {
           cliente.setEndereco(endereco); //nothing important here, just another object
           gerarVenda(); //who populates my "venda object with data"
           myIntent.putExtra("venda", venda);
       }
       startActivity(myIntent); 
    }
});

А вот, writeToParcel этого объекта "Venda":

@Override
public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(numeroContrato);
    dest.writeString(numeroProposta);
    dest.writeString(observacaoComplementar);
    dest.writeString(tipoVenda);
    dest.writeString(fidelidade);
    dest.writeString(hash);
    dest.writeString(oferta);

    dest.writeParcelable(visita, flags);
    dest.writeParcelable(midia, flags);
    dest.writeParcelable(tipoContratoVenda, flags);
    dest.writeParcelable(periodoInstalacao, flags);
    dest.writeParcelable(produtoAgrupamento, flags);
    dest.writeParcelable(formaPagamento, flags);
    dest.writeParcelable(vendaInternet, flags);

}

В этом классе у меня есть конструктор, который вызывает метод: "readFromParcel" здесь конструктор:

private Venda(Parcel source) {
    readFromParcel(source);
}

А вот и метод readFromParcel (несколько раз проверял порядок элементов на записи и этот метод)

 private void readFromParcel(Parcel in) {

        numeroContrato = in.readString();
        numeroProposta = in.readString();
        observacaoComplementar = in.readString();
        tipoVenda = in.readString();
        fidelidade = in.readString();
        hash = in.readString();
        oferta = in.readString();

        visita =  in.readParcelable(Visita.class.getClassLoader());
        midia = in.readParcelable(Midia.class.getClassLoader());
        tipoContratoVenda = in.readParcelable(TipoContratoVenda.class.getClassLoader());
        periodoInstalacao = in.readParcelable(Periodo.class.getClassLoader());
        produtoAgrupamento = in.readParcelable(ProdutoAgrupamento.class.getClassLoader());
        formaPagamento = in.readParcelable(FormaPagamento.class.getClassLoader());
        vendaInternet =     in.readParcelable(VendaInternet.class.getClassLoader());
    }

Все эти методы readParcelable принадлежат пользовательскому объекту, и класс этих объектов также реализует Parcelable и все его методы.

здесь ошибка LogCat возникает в этой строке:

            periodoInstalacao = in.readParcelable(Periodo.class.getClassLoader());
        produtoAgrupamento = in.readParcelable(ProdutoAgrupamento.class.getClassLoader());

Пробовал комментировать, заменять, но ошибка сохраняется на соседних объектах.

Логкат:

12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  FATAL EXCEPTION: main
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  java.lang.RuntimeException: Unable to start activity ComponentInfo{projetoTeste/projetoTeste.controle.Activity_VendaProduto}: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.access$600(ActivityThread.java:123)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:99)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Looper.loop(Looper.java:137)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:4424)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:511)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  Caused by: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.readFromParcel(Venda.java:343)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.<init>(Venda.java:69)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.<init>(Venda.java:12)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda$1.createFromParcel(Venda.java:349)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda$1.createFromParcel(Venda.java:347)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readParcelable(Parcel.java:1992)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readValue(Parcel.java:1854)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readMapInternal(Parcel.java:2094)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Bundle.unparcel(Bundle.java:223)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Bundle.getParcelable(Bundle.java:1158)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.controle.Activity_VendaProduto.onCreate(Activity_VendaProduto.java:79)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.Activity.performCreate(Activity.java:4465)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      ... 11 more

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

Заранее спасибо!

--- ОБНОВИТЬ ---

Решено, я выполнил шаги ответа, исправил некоторые преобразования/запись/чтение в списках и массивах, и теперь все работает нормально! Спасибо!


person krustbr    schedule 28.05.2013    source источник
comment
Попробуйте заменить все аргументы getClassLoader() на null, например. tipoContratoVenda = in.readParcelable(null); для всех объектов Parcelable.   -  person Yaroslav Mytkalyk    schedule 28.05.2013
comment
что такое периодоInstalacao и produtoAgrupamento?   -  person mromer    schedule 28.05.2013
comment
produtoAgrupamento — это объект ProdutoAgrupamento, а PeriodoInstalacao — класс Periodo (оба реализуют Parcelable и методы, но внутри класса ProdutoAgrupamento у меня есть: private ProdutoTipo[] tipoProdutoLista; этот список, не знаю, вызывает ли этот парень эту ошибку, я так не думаю, потому что даже когда я комментирую produtoAgrupamento, ошибка приведения все еще возникает с подчиненным объектом в методе чтения   -  person krustbr    schedule 28.05.2013
comment
И заменив classLoader на null, я получаю первый (нулевой) объект: ERROR AndroidRuntime, вызванный: android.os.BadParcelableException: ClassNotFoundException при демаршаллинге: projetoTeste.dto.Visita .. и: ERROR AndroidRuntime, вызванный: android.os.BadParcelableException: ClassNotFoundException при разупорядочении: projetoTeste.dto.Visita   -  person krustbr    schedule 28.05.2013
comment
Не знаю, поможет ли, но вот мой класс Periodo: pastebin.com/2umQSxx4 А вот мой класс produtoAgrupamento: pastebin.com/LzYKN0rF   -  person krustbr    schedule 28.05.2013


Ответы (1)


Просто для правильного стиля кода добавьте общие типы в CREATOR для всех объектов Parcelable. Для Periodo это должно быть

public static final Parcelable.Creator<Periodo> CREATOR = new Parcelable.Creator<Periodo>() {

Вам не нужно делать

if(tipoProdutoLista != null){
    for(int i=0; i < tipoProdutoLista.length;++i){
        parcelableTipoProduto[i] = (Parcelable) tipoProdutoLista[i];
    }
    dest.writeParcelableArray(parcelableTipoProduto, flags);
}

Просто передайте типоПродутоЛиста как есть, он уже Parcelable, и снимите флаги.

dest.writeParcelableArray(tipoProdutoLista, 0);

Ошибка в том, что вы не должны добавлять тот же флаг, который вы получили в качестве аргумента writeToParcel при записи в Parcelable.

Замените флаги при вызове writeParcelable на ноль

Был

dest.writeParcelable(visita, flags);

Должно быть

dest.writeParcelable(visita, 0);

Замените его во всех местах, где у вас есть вызов writeParcelable.

person Yaroslav Mytkalyk    schedule 28.05.2013
comment
Я делаю изменения, но я использовал это для списка, потому что, когда я пытаюсь использовать writeParcelableArray, я получаю: code метод writeParcelableArray в классе Parcel не может быть применен к заданным типам; требуется: T[],int найдено: List‹Produto›,int причина: не существует экземпляра(ов) переменной(ов) типа T, поэтому тип аргумента List‹Produto› соответствует типу формального параметра T[], где T является переменная типа: T расширяет Parcelable, объявленный в методе ‹T›writeParcelableArray(T[],int)` - person krustbr; 28.05.2013
comment
А также не может выполнять приведение: produtoList = in.readParcelableArray(Produto.class.getClassLoader()); причина найденного Parcelable[] вместо Produto[], и кастинг с (Produto) не работал. - person krustbr; 28.05.2013
comment
Я изменил все классы для универсальных типов в CREATOR и изменил флаги на 0 в методах writeParcelable. (Прокомментировал причину ошибки списка посылок в предыдущем комментарии) Те же строки/ошибка: java.lang.RuntimeException: Unable to start activity ComponentInfo{projetoTeste/projetoTeste.controle.Activity_VendaProduto}: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento Caused by: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento - person krustbr; 28.05.2013
comment
Я прокомментировал этого парня с периодом, вот как выглядит новая ошибка: ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{projetoTeste/projetoTeste.controle.Activity_VendaProduto}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: И: ERROR AndroidRuntime Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: - person krustbr; 28.05.2013
comment
И logcat указывает на этого парня в классе produtoAgrupamento: parcelableTipoProduto = in.readParcelableArray(ProdutoTipo.class.getClassLoader()); - person krustbr; 28.05.2013
comment
Реализует ли Produto Parcelable? - person Yaroslav Mytkalyk; 28.05.2013
comment
Да, Produto, ProdutoTipo, все эти ребята реализуют посылки, а теперь и методы Generic CREATOR, дайте мне знать, могу ли я предоставить какой-либо другой код, чтобы прояснить проблему. - person krustbr; 28.05.2013
comment
Спасибо, вы действительно помогли мне с комментариями создателя, когда я пытался привести подкласс к классу. переопределение функции создателя устраняет ошибку приведения. - person Ido; 17.04.2015