首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题解编组麻袋

问题解编组麻袋
EN

Stack Overflow用户
提问于 2010-01-03 21:02:08
回答 9查看 47.9K关注 0票数 61

我有几个实现Parcelable的类,其中一些类作为属性相互包含。我正在将这些类编组到一个包裹中,以便在活动之间传递它们。将它们编组到Parcel,但是当我试图解开它们时,我会得到以下错误:

代码语言:javascript
复制
...
AndroidRuntime  E  Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: schemas.Arrivals.LocationType
AndroidRuntime  E   at android.os.Parcel.readParcelable(Parcel.java:1822)
AndroidRuntime  E   at schemas.Arrivals.LayoverType.<init>(LayoverType.java:121)
AndroidRuntime  E   at schemas.Arrivals.LayoverType.<init>(LayoverType.java:120)
AndroidRuntime  E   at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:112)
AndroidRuntime  E   at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:1)
AndroidRuntime  E   at android.os.Parcel.readTypedList(Parcel.java:1509)
AndroidRuntime  E   at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:244)
AndroidRuntime  E   at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:242)
AndroidRuntime  E   at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:234)
AndroidRuntime  E   at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:1)
...

LayoverType类(失败的地方):

代码语言:javascript
复制
public class LayoverType implements Parcelable {    
    protected LocationType location;
    protected long start;
    protected long end;

    public LayoverType() {}

    public LocationType getLocation() {
        return location;
    }

    public void setLocation(LocationType value) {
        this.location = value;
    }

    public long getStart() {
        return start;
    }

    public void setStart(long value) {
        this.start = value;
    }

    public long getEnd() {
        return end;
    }

    public void setEnd(long value) {
        this.end = value;
    }


    // **********************************************
    //  for implementing Parcelable
    // **********************************************

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(location, flags);
        dest.writeLong(start);
        dest.writeLong(end  );
    }

    public static final Parcelable.Creator<LayoverType> CREATOR = new Parcelable.Creator<LayoverType>() {
        public LayoverType createFromParcel(Parcel in) {
            return new LayoverType(in);
        }

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

    private LayoverType(Parcel dest) {
        location = (LocationType) dest.readParcelable(null);    // it's failing here
        start = dest.readLong();
        end   = dest.readLong();
    }
}

下面是LocationType类:

代码语言:javascript
复制
public class LocationType implements Parcelable {
    protected int locid;
    protected String desc;
    protected String dir;
    protected double lat;
    protected double lng;

    public LocationType() {}

    public int getLocid() {
        return locid;
    }

    public void setLocid(int value) {
        this.locid = value;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String value) {
        this.desc = value;
    }

    public String getDir() {
        return dir;
    }

    public void setDir(String value) {
        this.dir = value;
    }

    public double getLat() {
        return lat;
    }

    public void setLat(double value) {
        this.lat = value;
    }

    public double getLng() {
        return lng;
    }

    public void setLng(double value) {
        this.lng = value;
    }

    // **********************************************
    //  for implementing Parcelable
    // **********************************************


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt   (locid);
        dest.writeString(desc );
        dest.writeString(dir  );
        dest.writeDouble(lat  );
        dest.writeDouble(lng  );
    }

    public static final Parcelable.Creator<LocationType> CREATOR = new Parcelable.Creator<LocationType>() {
        public LocationType createFromParcel(Parcel in) {
            return new LocationType(in);
        }

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

    private LocationType(Parcel dest) {
        locid = dest.readInt   ();
        desc  = dest.readString();
        dir   = dest.readString();
        lat   = dest.readDouble();
        lng   = dest.readDouble();
    }
}

更新2:据我所知,它在以下代码(来自包裹来源)中失败:

代码语言:javascript
复制
Class c = loader == null ? Class.forName(name) : Class.forName(name, true, loader);

为什么找不到这门课?它既存在又实现了Parcelable

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-02-06 18:25:30

由于“应答”中没有回答这一点,但在评论中,我将发布一个答复:正如@Max指出的那样,您应该使用LocationType.class.getClassLoader()来获得正确的ClassLoader,并消除ClassNotFound异常,即:

in.readParceleable(LocationType.class.getClassLoader());

票数 83
EN

Stack Overflow用户

发布于 2010-09-27 18:41:19

在下面的设置中,我也遇到了同样的问题:一些处理程序创建了一条消息,并通过Messenger将其发送到远程服务。

这条信息包含了一个包,我把我的可分析的后代放在这里:

代码语言:javascript
复制
final Message msg = Message.obtain(null, 0);
msg.getData().putParcelable("DOWNLOADFILEURLITEM", downloadFileURLItem);

messenger.send(msg);

当远程服务试图打开包裹时,我也有同样的例外。在我的例子中,我曾经监督过远程服务确实是一个单独的os进程。因此,我必须将当前的类加载器设置为服务端的解分段过程使用:

代码语言:javascript
复制
final Bundle bundle = msg.getData();
bundle.setClassLoader(getClassLoader());

DownloadFileURLItem urlItem = (DownloadFileURLItem)
bundle.getParcelable("DOWNLOADFILEURLITEM");

Bundle.setClassLoader设置类加载器,用于加载适当的Parcelable类。在远程服务中,需要将其重置为当前的类加载器。

票数 36
EN

Stack Overflow用户

发布于 2010-03-03 12:22:00

我发现问题在于我没有将我的应用程序ClassLoader传递给解编组功能:

代码语言:javascript
复制
in.readParceleable(getContext().getClassLoader());

而不是:

代码语言:javascript
复制
in.readParceleable(null); 

代码语言:javascript
复制
in.readParceleable(MyClass.class.getClassLoader()); 
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1996294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档