ClassNotFoundException 解组时真的不知道为啥

Posted

技术标签:

【中文标题】ClassNotFoundException 解组时真的不知道为啥【英文标题】:ClassNotFoundException when unmarshalling and really don't know whyClassNotFoundException 解组时真的不知道为什么 【发布时间】:2013-03-04 10:51:00 【问题描述】:

已修复:答案在底部

我正在为一个项目编写一个 android 应用程序,并且我正在尝试使用 parcelable 对象。 我有2个parcalable类。第一个是只有 2 个参数的普通类。 第二个是具有附加属性的类和具有第一个类的类型和它的附加对象的列表。

每次我尝试将第二类的对象传递给另一个 Activity 时,我都会得到 android.os.BadParcelableException: ClassNotFoundException when unmarshalling

然后应用关闭。

我现在搜索了几个小时并尝试了多种解决方案,但没有任何帮助。 当我只将第一类的对象传递给另一个活动时,错误不会出现..

这是我的代码:

package de.softwareproject.v3.testclasses;

import android.os.Parcel;
import android.os.Parcelable;

public class Cart implements Parcelable 

private String name;
private Integer priceInCents;

public Cart() 

public Cart(Parcel in)
    readFromParcel(in);


public String getName() 
    return name;

public void setName(String name) 
    this.name = name;

public Integer getPriceInCents() 
    return priceInCents;

public void setPriceInCents(Integer priceInCents) 
    this.priceInCents = priceInCents;


public static final Parcelable.Creator<Cart> CREATOR = new Parcelable.Creator<Cart>() 

            @Override
            public Cart createFromParcel(Parcel source) 
                return new Cart(source);
            

            @Override
            public Cart[] newArray(int size) 
                return new Cart[size];
            
;

@Override
public int describeContents() 
    // TODO Auto-generated method stub
    return 0;

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


private void readFromParcel(Parcel in) 
    name = in.readString();
    priceInCents = in.readInt();


我的第二课:

package de.softwareproject.v3.testclasses;

import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;

public class CurrentUser implements Parcelable 

private String username;
private String eMail;
private String password;
private List<Cart> carts;
private Cart activeCart;

public CurrentUser() 

public CurrentUser(Parcel in) 
    readFromParcel(in);


private void readFromParcel(Parcel in) 
    username = in.readString();
    eMail = in.readString();
    password = in.readString();
    activeCart = in.readParcelable(de.softwareproject.v3.testclasses.Cart.class.getClassLoader());
    if (carts == null) carts = new ArrayList<Cart>(); 
    in.readTypedList(carts, Cart.CREATOR);


public String getUsername() 
    return username;

public void setUsername(String username) 
    this.username = username;

public String geteMail() 
    return eMail;

public void seteMail(String eMail) 
    this.eMail = eMail;

public String getPassword() 
    return password;

public void setPassword(String password) 
    this.password = password;

public List<Cart> getCarts() 
    return carts;

public void setCarts(List<Cart> carts) 
    this.carts = carts;

public Cart getActiveCart() 
    return activeCart;

public void setActiveCart(Cart activeCart) 
    this.activeCart = activeCart;


@Override
public int describeContents() 
    // TODO Auto-generated method stub
    return 0;

@Override
public void writeToParcel(Parcel dest, int flags) 
    dest.writeString(username);
    dest.writeString(eMail);
    dest.writeString(password);
    dest.writeTypedList(carts);
    dest.writeParcelable(activeCart, flags);


public static final Parcelable.Creator<CurrentUser> CREATOR = new Parcelable.Creator<CurrentUser>() 

    @Override
    public CurrentUser createFromParcel(Parcel in) 
        return new CurrentUser(in);
    

    @Override
    public CurrentUser[] newArray(int size) 
        return new CurrentUser[size];
    
;

请帮帮我。

编辑:这里是我的 Logcat

    03-15 16:24:08.139: E/Parcel(689): Class not found when unmarshalling: ??, e: java.lang.ClassNotFoundException: ??
    03-15 16:24:08.149: D/AndroidRuntime(689): Shutting down VM
    03-15 16:24:08.149: W/dalvikvm(689): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
    03-15 16:24:08.229: E/AndroidRuntime(689): FATAL EXCEPTION: main
    03-15 16:24:08.229: E/AndroidRuntime(689): java.lang.RuntimeException: Unable to start activity ComponentInfode.softwareproject.v3/de.softwareproject.v3.Startpage: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ??
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Handler.dispatchMessage(Handler.java:99)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Looper.loop(Looper.java:137)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread.main(ActivityThread.java:4340)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at java.lang.reflect.Method.invokeNative(Native Method)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at java.lang.reflect.Method.invoke(Method.java:511)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at dalvik.system.NativeStart.main(Native Method)
    03-15 16:24:08.229: E/AndroidRuntime(689): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ??
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Parcel.readParcelable(Parcel.java:1966)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at de.softwareproject.v3.testclasses.CurrentUser.readFromParcel(CurrentUser.java:26)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at de.softwareproject.v3.testclasses.CurrentUser.<init>(CurrentUser.java:19)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:80)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:1)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Parcel.readParcelable(Parcel.java:1992)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Parcel.readValue(Parcel.java:1854)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Parcel.readMapInternal(Parcel.java:2094)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Bundle.unparcel(Bundle.java:223)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.os.Bundle.getParcelable(Bundle.java:1158)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at de.softwareproject.v3.Startpage.onCreate(Startpage.java:34)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.Activity.performCreate(Activity.java:4465)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    03-15 16:24:08.229: E/AndroidRuntime(689):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    03-15 16:24:08.229: E/AndroidRuntime(689):  ... 11 more
    03-15 16:24:10.289: I/Process(689): Sending signal. PID: 689 SIG: 9

修复 我终于找到了错误,我简直不敢相信!!!

搜索了将近 1 1/2 天,所需要的只是切换 readFromParcel 或 writeToParcel 中的最后两个方法,因为它们的顺序不完全相同!!

不敢相信,但现在它起作用了。 对于每一个遇到相同错误的人,请检查 writeToParcel 和 readFromParcel 的顺序。 它们的顺序必须相同。

祝你有美好的一天,克里斯蒂安**

【问题讨论】:

发布您的 logcat 以查看您获得异常的确切位置。 我做了,希望你能看懂 你证明你输入的有效性了吗? 对不起,我不知道你的意思。我是android编程的新手。你的意思是我如何初始化我的课程? 似乎与这个问题非常相似:***.com/questions/1996294/… 【参考方案1】:

FIX 我终于找到了错误,我简直不敢相信!!!

搜索了将近 1 1/2 天,所需要的只是切换 readFromParcel 或 writeToParcel 中的最后两个方法,因为它们的顺序不完全相同!!

不敢相信,但现在它起作用了。对于每一个遇到相同错误的人,请检查 writeToParcel 和 readFromParcel 的顺序。它们的顺序必须相同。

(Christian Risch 自己解决了这个问题。不过,我相信这个网站的整洁性。也许他会自己关闭答案)

【讨论】:

被那个笑死了!好笑!这是对 SOF 的幽默打击。出乎意料! 大声笑,我没看到 :)) 我很高兴你相信整洁......你相信不拿不属于你的 300 分吗? ...你是对的。这些观点不应该是我的。我相信通过这种方式,答案会比其他方式覆盖更多的人。而且,当然,如果@christian Risch 想将其添加为他自己的答案,或者如果模组想重新分配给他的答案,我完全不会介意。 失去了我的 1 天.. 小混乱有时会导致更大的混乱【参考方案2】:

@覆盖 公共无效writeToParcel(包裹目的地,int标志) // 也可以先捆绑...

    dest.writeString(songs_id);
    dest.writeInt(check_song_favorite);
    dest.writeString(name);
    dest.writeString(track_image);
    dest.writeString(created_date);
    dest.writeString(status);
    dest.writeString(track);
    dest.writeString(artist_name);
    dest.writeString(uploader_name);
    dest.writeString(play_count);
    dest.writeString(share_count);
    dest.writeString(favorite_count);
    dest.writeString(genre);
    dest.writeString(user_id);
    dest.writeString(offline_download);
    dest.writeString(slug);


/**
 * Creates ArtistParcelable model from Parcel.
 */
public static final Parcelable.Creator<PlayerData> CREATOR = new Creator<PlayerData>() 
    @Override
    public PlayerData createFromParcel(Parcel source) 
        String songs_id = source.readString();
        int check_song_favorite = source.readInt();
        String name = source.readString();
        String track_image = source.readString();
        String created_date = source.readString();
        String status = source.readString();
        String track = source.readString();
        String artist_name = source.readString();
        String uploader_name = source.readString();
        String play_count = source.readString();
        String share_count = source.readString();
        String favorite_count = source.readString();
        String genre = source.readString();
        String user_id = source.readString();
        String offline_download = source.readString();
        String slug = source.readString();

        return new PlayerData(check_song_favorite,songs_id, name, created_date, track_image, status, track,
                artist_name, uploader_name, play_count, share_count, favorite_count,genre,user_id,offline_download,slug);
    

    @Override
    public PlayerData[] newArray(int size) 
        return new PlayerData[size];
    
;

尝试以相同的方式管理 writeToParcel 和 readFromParcel。解决了我的问题。

【讨论】:

【参考方案3】:

对于偶然发现这个问题的人来说,上面的答案对我有用,但并不完全正确。 我的问题是我的字段初始化程序的顺序不正确。

代码是这样的:

protected Shop(Parcel in) 
    id = in.readInt();
    contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());
    name = in.readString();

在我的班级中,这些字段按以下顺序声明:

@SerializedName("Id")
public int id;

@SerializedName("Name")
public String name;

@SerializedName("ContactInfo")
public ShopContactInfo contactInfo;

注意

name = in.readString();

在下面

contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());

以下代码修复了它:

protected Shop(Parcel in) 
    id = in.readInt();
    name = in.readString();
    contactInfo = in.readParcelable(ShopContactInfo.class.getClassLoader());

【讨论】:

以上是关于ClassNotFoundException 解组时真的不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章

YouTube Android Player API 在解组时抛出“BadParcelableException ClassNotFoundException:asc”与新的 YouTube 版本

cad怎么解组,cad如何解组?

如何调试 JAXB 解组?

如何解组 JSON?

GOLANG 解组动态 JSON

如何正确解组不同类型的数组?