Nested Parcelling: RuntimeException - Unmarshalling неизвестный код типа 3211319 по смещению 440 - PullRequest
6 голосов
/ 15 ноября 2010

Мне нужно отправить некоторые данные на Activity, который может работать в другом контексте. Для этого я создал класс скажем A, в котором ArrayList типа данных скажет B как один из членов экземпляра. Я объявил класс B внутренним классом класса A. Чтобы отправить экземпляр этого класса A через Intent, я создал класс A и B оба Parcelable.

Структура классов выглядит примерно так (сюда не входит полный код, например код, написанный для создания классов Parcelable):

public class A implements Parcelable{

   public class B implements Parcelable{
         public ArrayList<String> value;
         ....
         .... 
          public void writeToParcel(Parcel dest, int flags) {
            dest.writeList(value);
           }
        ....
        ....
   }

   public List<B> group;
   public String name;

   ....
   .... 
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(group);
        dest.writeString(name);
       }
   ....
   ....
}

Я использовал функцию putExtra (String name, Parcelable value) для помещения данных.

Но на принимающей стороне я получил следующее исключение:

 Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 1087): 1289817569622 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.SET_VOIP_SUPP_SERVICE_REQUEST_LOCAL (has extras) } in com.hsc.example.android.MyApp.MyAppActuvity$1@43b409b0
E/AndroidRuntime( 1087):        at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:765)
E/AndroidRuntime( 1087):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 1087):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1087):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1087):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 1087):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1087):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1087):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 1087):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 1087):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1087): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@43b51240: Unmarshalling unknown type code 3211319 at offset 440
E/AndroidRuntime( 1087):        at android.os.Parcel.readValue(Parcel.java:1777)
E/AndroidRuntime( 1087):        at android.os.Parcel.readListInternal(Parcel.java:1956)
E/AndroidRuntime( 1087):        at android.os.Parcel.readList(Parcel.java:1302)
E/AndroidRuntime( 1087):        at com.hsc.example.android.MyApp.A.<init>(A.java:61)
E/AndroidRuntime( 1087):        at com.hsc.example.android.MyApp.A.<init>(A.java:57)
E/AndroidRuntime( 1087):        at com.hsc.example.android.MyApp.A$1.createFromParcel(A.java:67)
E/AndroidRuntime( 1087):        at com.hsc.example.android.MyApp.A$1.createFromParcel(A.java:1)
E/AndroidRuntime( 1087):        at android.os.Parcel.readParcelable(Parcel.java:1845)
E/AndroidRuntime( 1087):        at android.os.Parcel.readValue(Parcel.java:1713)
E/AndroidRuntime( 1087):        at android.os.Parcel.readMapInternal(Parcel.java:1947)
E/AndroidRuntime( 1087):        at android.os.Bundle.unparcel(Bundle.java:169)
E/AndroidRuntime( 1087):        at android.os.Bundle.getParcelable(Bundle.java:1037)
E/AndroidRuntime( 1087):        at android.content.Intent.getParcelableExtra(Intent.java:3269)
E/AndroidRuntime( 1087):        at com.hsc.example.android.MyApp.MyAppActuvity$1.onReceive(MyAppActuvity.java:219)
E/AndroidRuntime( 1087):        at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:754)
E/AndroidRuntime( 1087):        ... 9 more

Затем я переместил класс B за пределы класса A (поскольку я думал, что это может быть проблемой внутреннего класса, и объявил статический объект CREATOR. Это статическое объявление отсутствовало, когда класс B был внутренним классом класса A). Но это не помогло.

Похоже, эта проблема из-за вложенного Parceling.

Любое предложение ??

ПРИМЕЧАНИЕ : когда я использовал функцию android.os.Bundle.putParcelable(String key, Parcelable value) класса Bundle, а затем распаковал ее с помощью android.os.Bundle.getParcelable(String key), тогда все в порядке. Таким образом, похоже, что проблема касается только Intents.

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Включили ли вы СОЗДАТЕЛЯ для обоих?

public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<A>() {
   public A createFromParcel(Parcel in) {
      return new A(in);
      }

   public A[] newArray(int size) {
      return new A[size];
      }
};

и конструкторов, которые принимают посылку:

public A(Parcel parcel) {
   name = parcel.readString();
   //etc..
}

?

0 голосов
/ 15 апреля 2014
  1. Изменить List<B> на ArrayList<B>
  2. Используйте writeTypedList и readTypedList для записи и чтения ArrayList
...