2013-03-15 12 views
14

STAŁY: Odpowiedź na doleClassNotFoundException gdy unmarshalling i naprawdę nie wiem, dlaczego

piszę aplikację na Androida dla projektu i im próbuje użyć parcelable obiektów. Mam 2 klasy, które można przewozić. Pierwsza to normalna klasa z tylko 2 argumentami. Druga to klasa z dodatkowymi atrybutami i listą z typem z pierwszej klasy i dodatkowym Przedmiotem.

Za każdym razem staram się przekazać obiekt drugiej klasy do innej działalności, ja dostać android.os.BadParcelableException: ClassNotFoundException gdy unmarshalling

a aplikacja zamyka.

Szukałem wiele godzin i próbowałem wielu rozwiązań, ale nic nie pomogło. Błąd robi się kiedy tylko przekazać obiekt pierwszej klasy do innej działalności ..

Oto mój kod:

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

moja druga klasa:

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

proszę mi pomóc.

Edycja: Oto moja 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 końcu znalazłem błąd, a ja po prostu nie mogę w to uwierzyć !!! wariować

Wyszukiwany przez prawie 1 1/2 dni i wszystko, co potrzebne, to przełączanie dwóch ostatnich metod w readFromParcel lub writeToParcel, ponieważ nie były w dokładnie tej samej kolejności !!

Nie mogę w to uwierzyć, ale teraz działa. Dla każdego, kto popełni ten sam błąd, sprawdź kolejność writeToParcel i readFromParcel. Thay muszą być w tej samej kolejności.

Miłego dnia, Christian **

+0

Opublikuj swój logcat, aby zobaczyć, gdzie dokładnie pojawia się wyjątek. – DigCamara

+0

Zrobiłem, mam nadzieję, że możesz to przeczytać –

+0

czy potwierdzasz ważność swoich danych wejściowych? – MemLeak

Odpowiedz

27

FIX końcu znalazłem błąd, a ja po prostu nie mogę w to uwierzyć !!! wariować

Wyszukiwany przez prawie 1 1/2 dni i wszystko, co potrzebne, to przełączanie dwóch ostatnich metod w readFromParcel lub writeToParcel, ponieważ nie były w dokładnie tej samej kolejności !!

Nie mogę w to uwierzyć, ale teraz działa. Dla każdego, kto popełni ten sam błąd, sprawdź kolejność writeToParcel i readFromParcel. Trzeba być w tej samej kolejności.

(Christian Risch rozwiązać go sam. Nadal wierzę w schludności na tej stronie. Może on zamknąć sam odpowiedź)

+0

Po prostu umarłem śmiejąc się z tego! Wesoły! To było uderzenie humoru w SOF; niespodziewany! – sud007

+0

LOL, nie widziałem, że nadchodzi :)) – mohnage7

0

@Override public void writeToParcel (działki dest, int flags) { // alternatywnie może bundle pierwszy ...

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

spróbować zarządzać writeToParcel i readFromParcel w ten sam sposób. Rozwiązałem mój problem.

Powiązane problemy