ClassCastException при попытке сделать readParcelable на пользовательский массив объектов
Я пытаюсь реализовать Parcelable вместо Serializable, поскольку это должно быть более эффективным. Из моей основной активности я хочу передать объект сообщения в другую активность, мое сообщение класса содержит другие классы.
Если я пройду мимо этой ошибки, я уверен, что столкнусь с гораздо большим их количеством, но прямо сейчас, когда я пытаюсь запустить свое приложение, я получаю
Это мой класс Сообщений:
import java.util.ArrayList;
import android.os.Parcel;
import android.os.Parcelable;
public class Message implements Parcelable {
int id;
int space_id;
String text;
String html;
String created_at;
int[] comments;
boolean is_liked;
int[] liked_by;
int[] starred_by;
boolean is_starred;
boolean is_followed;
int[] followed_by;
ArrayList<AttachmentsData> attachments;
String url;
int[] tags;
boolean is_system;
public User created_by;
public Permissions persmissions;
public Embed embed;
public Tokens[] tokens;
/** Parcelable **/
public Message(Parcel in) {
readFromParcel(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(space_id);
dest.writeString(text);
dest.writeString(html);
dest.writeString(created_at);
dest.writeIntArray(comments);
dest.writeInt(is_liked ? 1 : 0);
dest.writeIntArray(liked_by);
dest.writeIntArray(starred_by);
dest.writeInt(is_starred ? 1 : 0);
dest.writeInt(is_followed ? 1 : 0);
dest.writeIntArray(followed_by);
dest.writeList(attachments);
dest.writeString(url);
dest.writeIntArray(tags);
dest.writeInt(is_system ? 1 : 0);
dest.writeParcelable(created_by, flags);
dest.writeParcelable(persmissions, flags);
dest.writeParcelable(embed, flags);
dest.writeParcelableArray(tokens, flags);
}
private void readFromParcel(Parcel in) {
id = in.readInt();
space_id = in.readInt();
text = in.readString();
html = in.readString();
created_at = in.readString();
//in.readIntArray(comments);
comments = in.createIntArray();
is_liked = in.readInt() == 0;
//in.readIntArray(liked_by);
liked_by = in.createIntArray();
//in.readIntArray(starred_by);
starred_by = in.createIntArray();
is_starred = in.readInt() == 0;
is_followed = in.readInt() == 0;
//in.readIntArray(followed_by);
followed_by = in.createIntArray();
in.readList(attachments, AttachmentsData.class.getClassLoader());
url = in.readString();
//in.readIntArray(tags);
tags = in.createIntArray();
is_system = in.readInt() == 0;
created_by = in.readParcelable(User.class.getClassLoader());
persmissions = in.readParcelable(Permissions.class.getClassLoader());
embed = in.readParcelable(Embed.class.getClassLoader());
tokens = in.readParcelable(Tokens.class.getClassLoader();
}
public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() {
public Message createFromParcel(Parcel in) {
return new Message(in);
}
public Message[] newArray(int size) {
return new Message[size];
}
};
/** Getters and setters, I'll spare you these **/
}
И это ошибка, которую я получаю:
Фатальное исключение: main Ява.яз..RuntimeException: не удается запустить
деятельность
ComponentInfo{com.образец.стимул / ком.образец.стимул.Комментарии}:
Ява.яз..ClassCastException: android.ос.Parcelable[] не может быть брошен
к ком.образец.стимул.messagemodel.Токены [] на
андроид.апп.ActivityThread.performLaunchActivity (ActivityThread.Ява: 1967)
около
андроид.апп.ActivityThread.handleLaunchActivity (ActivityThread.java: 1992)
на Андроиде.апп.ActivityThread.доступ$600 (ActivityThread.java: 127) на
андроид.апп.ActivityThread$H. handleMessage (ActivityThread.Ява: 1158)
на Андроиде.ос.Обработчик.dispatchMessage (обработчик.java: 99) at
андроид.ос.Петлитель.петля (Looper.java: 137) на
андроид.апп.ActivityThread.main (ActivityThread.java: 4441) на
Ява.яз..отражать.Метод.invokeNative (Native Method) at
Ява.яз..отражать.Метод.метод Invoke.java:511) на
ком.андроид.внутренний.ос.ZygoteInit$MethodAndArgsCaller.беги (Зиготеинит.java: 784)
на ком.андроид.внутренний.ос.Зиготеинит.главный (Зиготеинит.java: 551) около
далвик.система.NativeStart.main (Native Method), вызванный:
Ява.яз..ClassCastException: android.ос.Parcelable[] не может быть брошен
к ком.образец.стимул.messagemodel.Токены [] на
ком.образец.стимул.messagemodel.Сообщение.readFromParcel (сообщение.java: 94)
на ком.образец.стимул.messagemodel.Сообщение.(Сообщение.java: 35)
около
ком.образец.стимул.messagemodel.Сообщение$1.createFromParcel (сообщение.java: 100)
около
ком.образец.стимул.messagemodel.Сообщение$1.createFromParcel (сообщение.java:1)
на Андроиде.ос.Посылка.readParcelable (посылка.java: 1992) на
андроид.ос.Посылка.readValue (посылка.Ява: 1854) на
андроид.ос.Посылка.readMapInternal (посылка.java: 2094) на
андроид.ос.Пакет.unparcel (пачка.java: 223) на
андроид.ос.Пакет.getParcelable (связка.java: 1158) на
ком.образец.стимул.Комментарии.onCreate (комментарии.Ява: 67) на
андроид.апп.Деятельность.performCreate (деятельность.java: 4465) на
андроид.апп.Аппаратура.callActivityOnCreate(контрольно-измерительные приборы.java: 1049)
около
андроид.апп.ActivityThread.performLaunchActivity (ActivityThread.Ява: 1931 год)
... Еще 11
Я думаю, что сейчас уместно следующее:
Вызвано: java.яз..ClassCastException: android.ос.Parcelable[]
не может быть приведен к com.образец.стимул.messagemodel.Токены [] на
ком.образец.стимул.messagemodel.Сообщение.readFromParcel (сообщение.java: 94)
Так я, наверное, и делаю. это один неправильно:
жетоны = in.readParcelable (токены.класс.getClassLoader ();
Вот мой класс токенов:
import android.os.Parcel;
import android.os.Parcelable;
public class Tokens implements Parcelable {
String type;
String value;
int start;
int end;
/** Parcelable related **/
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(type);
dest.writeString(value);
dest.writeInt(start);
dest.writeInt(end);
}
private Tokens(Parcel in) {
type = in.readString();
value = in.readString();
start = in.readInt();
end = in.readInt();
}
public static final Parcelable.Creator<Tokens> CREATOR = new Parcelable.Creator<Tokens>() {
public Tokens createFromParcel(Parcel in) {
return new Tokens(in);
}
public Tokens[] newArray(int size) {
return new Tokens[size];
}
};
/** Getters and setters **/
}
Я обыскал весь день и я не могу видеть, чтобы найти, как это сделать правильно. Кто-нибудь знает?
2 ответов:
Используйте writeTypedArray и readTypedArray для чтения и записи массива в посылку
Читать
tokens = in.createTypedArray(Tokens.CREATOR);Написать
in.writeTypedArray(tokens, flags);
Попробуйте это...
Заменить
tokens = in.readParcelable(Tokens.class.getClassLoader();С
tokens = in.readParcelableArray(Tokens.class.getClassLoader());Вы пишете Parcelable массив, но читаете его как Parcelable
Comments