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());

Опитах се да коментирам, да заменя, но грешката продължава в съседните обекти.

Logcat:

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
какъв е типът на periodoInstalacao и 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, получавам на първия (нулев) обект: ГРЕШКА AndroidRuntime, причинена от: android.os.BadParcelableException: ClassNotFoundException при демаршалиране: projetoTeste.dto.Visita .. и: ГРЕШКА 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)


@Brendan Всъщност липсата на библиотеки на трети страни е МНОГО често срещано изискване, което съм срещал при проекти в корпоративния свят.
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, всички тези момчета имплементират parcelables и сега с Generic CREATOR методи, уведомете ме, ако мога да предоставя някакъв друг код за изясняване на проблема - person krustbr; 28.05.2013
comment
Благодаря, ти всъщност ми помогна с коментарите на създателя, когато се опитах да прехвърля подклас към класа. надхвърлянето на функцията създател разрешава грешката в каста. - person Ido; 17.04.2015