2013-05-06 2 views
2

Я получаю эту ошибку:Parceable встречается IOException писать сериализуемую объект

   FATAL EXCEPTION: main 
     java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = game.Level) 
     at android.os.Parcel.writeSerializable(Parcel.java) 
     at android.os.Parcel.writeValue(Parcel.java) 
     at android.os.Parcel.writeMapInternal(Parcel.java) 
     at android.os.Bundle.writeToParcel(Bundle.java) 
     at android.os.Parcel.writeBundle(Parcel.java) 
     at android.content.Intent.writeToParcel(Intent.java) 
     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java) 
     at android.app.Instrumentation.execStartActivity(Instrumentation.java) 
     at android.app.Activity.startActivityForResult(Activity.java) 
     at android.app.Activity.startActivityForResult(Activity.java) 
     at android.app.Activity.startActivity(Activity.java) 
     at android.app.Activity.startActivity(Activity.java) 
     at menu.AreaAdapter$1.onClick(AreaAdapter.java:93) 
     at android.view.View.performClick(View.java) 
     at android.view.View$PerformClick.run(View.java) 
     at android.os.Handler.handleCallback(Handler.java) 
     at android.os.Handler.dispatchMessage(Handler.java) 
     at android.os.Looper.loop(Looper.java) 
     at android.app.ActivityThread.main(ActivityThread.java) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.io.NotSerializableException: menu.AreaActivity 
     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) 
     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 

При выполнении этого:

holder.butArea.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Intent myIntent = new Intent(v.getContext(), game.LevelActivity.class); 
       myIntent.putExtra("switchlevel", LevelSwitchCase.getLevel(currentLevel, (pos+1),mContext)); 
       myIntent.putExtra("level",currentLevel); 
       myIntent.putExtra("area", (pos+1)); 

       v.getContext().startActivity(myIntent); 

      } 
     }); 

game.level реализует сериализацию и получает сообщение об ошибке при запуске намерения (ст. getContext(). startActivity (myIntent);)

уровень и площадь - это целые числа, а уровень переключателя - уровень, который я получаю (реализует Serializable)

+0

при попытке сериализации любого объекта, помещенного во дополнительное «switchlevel», исключается исключение. Отправьте код этого класса или внимательно посмотрите на него и посмотрите, что может вызвать исключение ввода-вывода при его сериализации. –

ответ

6

Контекст не является Serializable. Чтобы исправить эту ошибку, я объявленный контекст, как эти (переменных не суммируются и не сериализации):

public transient Context mContext; 

или вы можете реализовать Parceable.

3

Если ваш класс уровня имеет не примитивные элементы, они также должны реализовать сериализуемое.

+1

Обычно каждый объект, который я там использую, реализует Serializable, может ли это быть другой проблемой? – David

0

Для тех, кто использует контекст или другие несериализуемые объекты внутри интерфейса. Просто передать его в качестве параметра метода, например:

public interface OnActionInterface { 
    void onPositiveButtonClicked(Activity activity); 
    void onNegativeButtonClicked(Activity activity); 
} 

Затем создайте автономный класс, как:

public class SomeClass implements OnActionInterface, Serializable { 
    private String action; 

    public SomeClass(String action) { 
     this.action = action; 
    } 

    @Override 
    public void onPositiveButtonClicked(Activity activity) { 
     Intent intent = new Intent(action); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     activity.startActivity(intent); 
    } 

    @Override 
    public void onNegativeButtonClicked(Activity activity) { 
     activity.finish(); 
    } 
} 

После этого вы можете использовать объекты этого класса внутри намерения.

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