ClassNotFoundException when unmarshalling and really don't know why

Christian Risch picture Christian Risch · Mar 15, 2013 · Viewed 16.6k times · Source

FIXED: ANSWER AT BOTTOM

I am writing an android app for a project and im trying to use parcelable objects. I have 2 parcalable classes. The first is a normal class with only 2 arguments. The second one is a class with additional attributes and a list with type from the first class and an additional Object of it.

Every time i try to pass an object of the second class to another Activity, i get android.os.BadParcelableException: ClassNotFoundException when unmarshalling

and the app closes.

I searched for hours now and tried multiple solutions but nothing helped. The Error doesnt come when i only pass an object of the first class to another activity..

Here my code:

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();
}
}

My Second Class:

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];
    }
};
}

Please help me.

Edit: Here my 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 ComponentInfo{de.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

FIX I finally found the error and I just can't freaking belive it!!!

Searched for almost 1 1/2 days and all it needed was switching the last two methods in readFromParcel or writeToParcel because they were not in the exact same order!!

Can't believe it but now it works. For every one who gets the same mistake, check the order of writeToParcel and readFromParcel. Thay have to be in the same order.

Have a nice day, Christian**

Answer

DigCamara picture DigCamara · Mar 15, 2013

FIX I finally found the error and I just can't freaking belive it!!!

Searched for almost 1 1/2 days and all it needed was switching the last two methods in readFromParcel or writeToParcel because they were not in the exact same order!!

Can't believe it but now it works. For every one who gets the same mistake, check the order of writeToParcel and readFromParcel. Thay have to be in the same order.

(Christian Risch solved it by himself. Still, I believe in neatness on this site. Maybe he'll close the answer himself)