尝试在自定义对象数组上执行readParcelable时出现ClassCastException

 n重庆商报程红Lft 发布于 2023-02-13 10:57

我正在尝试实现Parcelable而不是Serializble,因为它应该更高效.从我的MainActivity我想将Message对象传递给另一个activity,我的类Message包含其他类.如果我越过这一个错误,我确信我会遇到更多的错误,但是现在当我尝试运行我的应用程序时,我得到了

这是我的Message-class:

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 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 CREATOR = new Parcelable.Creator() {

        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 **/

 }

这是我得到的错误:

致命异常:主要了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.incentive/com.example.incentive.Comments}:java.lang.ClassCastException:android.os.Parcelable []不能被转换到COM. android.app.A活动时,我会在android.app.A活动时看到android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)的android.app.A活动时,我会在Android.app.ActivityThread.access $ 600(ActivityThread)上运行android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)的.java:127)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1158)在android.os.Handler.dispatchMessage(Handler.java:99)在android.os.Looper.loop(Looper.java: 137)在android.app.ActivityThread.main(ActivityThread.java:4441)在java.lang.reflect.Method.invokeNative(本机方法)在java.lang.reflect.Method.invoke(Method.java:511)在玉米位于dalvik.system.NativeStart.main的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)中的.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)(本机方法)引起:java.lang.ClassCastException:android.os.Parcelable []无法在com.example.incentive.messagemodel.Message.readFromParcel(消息.)中强制转换为com.example.incentive.messagemodel.Tokens []. java:94)com.example.incentive.messagemodel.Messl.(Message.java:35)com.example.incentive.messagemodel.Message $ 1.createFromParcel(Message.java:100)at com.example.incentive.messagemodel .Message $ 1.createFromParcel(Message.java:1)在android.os.Parcel.readParcelable(Parcel.java:1992)在android.os.Parcel.readValue(Parcel.java:1854)在android.os.Parcel.readMapInternal (Parcel.java:2094)在android.os.Bundle.unparcel(Bundle.java:223)在android.os.Bundle.getParcelable(Bundle.java:1158)在com.example.incentive.Comments.onCreate(评论. java:67)在android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1049)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)的android.app.Activity.performCreate(Activity.java:4465). ..还有11个

我现在认为相关的是:

引起:java.lang.ClassCastException:android.os.Parcelable []无法在com.example.incentive.messagemodel.Message.readFromParcel(Message.java:94)中强制转换为com.example.incentive.messagemodel.Tokens []

所以我可能做错了一件事:tokens = in.readParcelable(Tokens.class.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 CREATOR = new Parcelable.Creator() {

        public Tokens createFromParcel(Parcel in) {
            return new Tokens(in);
        }

        public Tokens[] newArray(int size) {
            return new Tokens[size];
        }
    };


    /** Getters and setters **/ 
}

我整个下午都在搜索,我看不清楚如何正确地做到这一点.有人知道吗?

1 个回答
  • 使用writeTypedArray和readTypedArray读取和写入数组到parcel

    tokens = in.createTypedArray(Tokens.CREATOR);
    

    in.writeTypedArray(tokens, flags);
    

    2023-02-13 10:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有