2013-03-15 2 views
14

ИСПРАВЛЕНО: ОТВЕТ НА НИЖНЕЙClassNotFoundException когда демаршаллизации и действительно не знаю, почему

Я пишу андроид приложение для проекта и им пытаются использовать parcelable объекты. У меня есть 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(); 
} 
} 

Мой второй класс:

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

Пожалуйста, помогите мне.

Edit: Вот мой 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 1/2 дня, и все, что ему нужно, это переключение двух последних методов в readFromParcel или writeToParcel, потому что они не были в том же порядке !!

Не могу поверить, но теперь это работает. Для каждого, кто получает ту же ошибку, проверьте порядок writeToParcel и readFromParcel. Тей должен быть в том же порядке.

Иметь хороший день, Christian **

+0

Опубликуйте свой логарифм, чтобы увидеть, где именно вы получаете исключение. – DigCamara

+0

я, надеюсь, вы можете прочитать его –

+0

У вас есть доказательства действительности вашего ввода? – MemLeak

ответ

27

FIX я наконец-то нашел ошибку, и я просто не могу долбанные верить его !!!

Искал почти 1 1/2 дня, и все, что ему нужно, это переключение двух последних методов в readFromParcel или writeToParcel, потому что они не были в том же порядке !!

Не могу поверить, но теперь это работает. Для каждого, кто получает ту же ошибку, проверьте порядок writeToParcel и readFromParcel. Тей должен быть в том же порядке.

(Christian Риш решил его сам. Тем не менее, я верю в опрятности на этом сайте. Может быть, он закроем самого ответа)

+0

Просто умер, смеясь над этим! Веселое! Это был юмористический удар по SOF; неожиданно! – sud007

+0

LOL, я не видел, чтобы это пришло :)) – mohnage7

0

@Override общественного недействительный writeToParcel (Parcel Dest, внутр флаги) { // в качестве альтернативы может связывать первый ...

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 таким же образом. Решила мою проблему.

Смежные вопросы