web-dev-qa-db-ja.com

マーシャリングを解除し、その理由が本当にわからない場合のClassNotFoundException

修正済み:回答AT BOTTOM

プロジェクト用にAndroidアプリを作成していて、パーセル可能なオブジェクトを使用しようとしています。2つのパーセル可能なクラスがあります。1つ目は引数が2つしかない通常のクラスです。2つ目は次のクラスです。追加の属性と、最初のクラスのタイプとその追加のオブジェクトのリスト。

2番目のクラスのオブジェクトを別のアクティビティに渡そうとするたびに、マーシャリングを解除するとAndroid.os.BadParcelableException:ClassNotFoundExceptionが発生します

そしてアプリが閉じます。

私は今何時間も検索し、複数の解決策を試しましたが、何も役に立ちませんでした。最初のクラスのオブジェクトを別のアクティビティに渡すだけの場合、エラーは発生しません。

ここに私のコード:

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

私の2番目のクラス:

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 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 [〜#〜]私はついにエラーを見つけました、そして私はそれを信じることができません!!!

ほぼ1日半検索しましたが、まったく同じ順序ではなかったため、readFromParcelまたはwriteToParcelの最後の2つのメソッドを切り替えるだけで済みました。

信じられないが、今はうまくいく。同じ間違いを犯したすべての人について、writeToParcelとreadFromParcelの順序を確認してください。 Thayは同じ順序である必要があります。

良い一日を、クリスチャン**

19
Christian Risch

修正私はついにエラーを見つけました、そして私はそれを信じることができません!!!

ほぼ1日半検索しましたが、まったく同じ順序ではなかったため、readFromParcelまたはwriteToParcelの最後の2つのメソッドを切り替えるだけで済みました。

信じられないが、今はうまくいく。同じ間違いを犯したすべての人について、writeToParcelとreadFromParcelの順序を確認してください。 Thayは同じ順序である必要があります。

(クリスチャン・リッシュは自分でそれを解決しました。それでも、私はこのサイトの清楚さを信じています。多分彼は自分で答えを閉じるでしょう)

34
DigCamara

@Override public void writeToParcel(Parcel dest、int flags){//または最初にバンドルすることもできます...

    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を同じ方法で管理してみてください。私の問題を解決しました。

0
ADITI09