Получение Unmarshalling кода неизвестного типа при повторной отправке одного и того же объекта

У меня есть круговой рабочий процесс, например

A -> B -> C -> A -> B -> C -> A -> B -> C...

Я передаю Parcelable из активности B в C. В первый раз это работает. Второй раз это дает мне

Parcel android.os.Parcel@405156d0: распаковка кода неизвестного типа 7471204 по смещению 1108

В строке чтение объекта.

Объект не изменился. Я не знаю, точно ли это тот же экземпляр, но, по крайней мере, содержимое точно такое же. Почему в первый раз работает, а во второй нет?

Иногда бывает и с первого раза.

Я попытался удалить все при записи/чтении (тестирование только с одним целочисленным полем) и все равно получаю то же самое.

При ошибке объект вообще не читается, выполняется строка с getParcelable(), но никогда не выполняется createFromParcel и далее конструктор. Просто выдает ошибку и ничего не делает. Так что это не ошибка парцелляции полей.

Я совершенно не в курсе...

Я попытался воспроизвести с очень маленькой тестовой средой - 2 действия и очень маленький объект, где я могу передать посылку столько раз, сколько захочу, и это правильно.

Я не могу опубликовать здесь весь свой код.

Я только хочу знать, какие вещи могут вызывать эту ошибку. writeToParcel и конструктор правильные, данные пишутся и читаются в том же порядке, правильные tpyes, есть еще переменная CREATOR тоже правильная, 100 раз все проверил. И, как сказано, это работает много раз. Иногда данные в объекте точно такие же (проверено, каждое поле содержит одно и то же значение), первый раз работает, второй раз показывает этот "Unmarshalling unknown type".

Еще одна вещь, которая довольно интересна и может быть связана, и я тоже не понимаю, заключается в том, что посылка, хотя я выполняю putExtra только один раз, записывается дважды. Ставлю логи и точно putExtra выполняется только один раз. Но writeToParcel выполняется дважды... не знаю почему. В упрощенном примере этого не происходит.

Любая подсказка приветствуется. Я проделал всю работу, чтобы передать свои параметры везде, используя Parcelable, и их много, потому что все говорят: «Я настоятельно рекомендую вместо этого использовать Parcelable», вы говорите, что ваши зубы кровоточат, и получаете «используйте Parcelable». Теперь я использую Parcelable, и все, что у меня есть, это новая куча проблем.


person User    schedule 26.06.2012    source источник
comment
Я думаю, вряд ли вы получите какие-то поклевки по этому вопросу. Вы, по сути, сказали, что уверены, что сделали все абсолютно правильно, но это не работает. Вы также не разместили никакого кода (даже немного). Что вы хотите, чтобы мы вам сказали?   -  person David Wasser    schedule 26.06.2012
comment
Значение этой ошибки или возможные причины, вызывающие ее. Кроме того, если у кого-то есть похожий опыт, он распознает его без кода... но да, когда у меня будет время, я уменьшу свой код до необходимого, чтобы показать это и скопировать сюда, возможно, это поможет заинтересовать другие целевые группы: )   -  person User    schedule 26.06.2012
comment
Смысл этой ошибки в том, что ваша посылка повреждена. Это означает, что либо ваши читатели/писатели не совпадают, либо вы каким-то образом добавили в посылку другой мусор. Но, основываясь на ваших других комментариях (методы вызываются дважды, когда они не должны, и т. д.), похоже, у вас есть другие проблемы. Может быть, у вас проблема с потоками (несколько потоков обращаются к одним и тем же данным несинхронизированным образом)? Невозможно узнать без дополнительной информации.   -  person David Wasser    schedule 26.06.2012
comment
Итак, я хочу задать этот вопрос, потому что я просто исправил эту ошибку в своем коде. Вы помните, пытались ли вы getExtra в onCreate методе своей деятельности?   -  person Spencer    schedule 23.10.2012
comment
привет, @Spencer, @Ixx. У меня та же проблема, и, как сказал @Spencer, да, я делаю это в onCreate(). Есть решение, советы?   -  person Ovidiu Latcu    schedule 01.02.2013
comment
Та же проблема. как решить эту проблему lxxm, Spencer, Ovidiu Latcu?   -  person Wayne    schedule 19.07.2013


Ответы (1)


Я получил эту ошибку, когда использовал класс Parcelable, добавил переменную в этот класс и забыл добавить эту переменную в методы "writeToParcel" и конструктор с объектом Parcel.

Это было решено путем добавления этой переменной к приведенным ниже методам.

@Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(id);
        dest.writeString(name);

}

public ItemDetails(Parcel source) {
        id = source.readString();
        name = source.readString();
}
person Radwa Elsahn    schedule 12.10.2014