NotSerializableException al presionar el botón de inicio
Tengo una Activity
en la que tengo una clase privada Datos. En el método onSaveInstanceState
, intento guardar esta una instancia de Data
. Esta es mi Actividad:
public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onSaveInstanceState(Bundle outState){ outState.putSerializable("TEST", new Data()); } private class Data implements Serializable { private static final long serialVersionUID = -4312723541994925110L; } }
Ahora, cuando cambio la orientación del dispositivo, el objeto Data
se guarda y se lee como debería. Sin embargo, cuando presiono el botón de inicio, la aplicación se bloquea con lo siguiente en el registro:
05-10 20: 05: 51.895: E / AndroidRuntime (30317): Java.lang.RuntimeException: Parcelable encontrado IOException que escribe un objeto serializable (nombre = Com.rigidbits.test.TestActivity $ Data) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): en android.os.Parcel.writeValue (Parcel.java:1130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeMapInternal (Paquete. Java: 488) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Bundle.writeToParcel (Bundle.java:1552) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : En android.os.Parcel.writeBundle (Parcel.java:502) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.handlePauseActivity (ActivityThread.java:2298) 05-10 20:05 : 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread $ H .handleMessage (ActivityThread.java:938) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Handler.dispatchMessage (Handler.java:99) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Looper.loop (Looper.java:130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.main (ActivityThread.java: 3683) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.lang.reflect.Method.invokeNative (Método nativo) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java .lang.reflect.Method.invoke (Method.java:507) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 862) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10 20: 05: 51.895: E / AndroidRuntime 30317): en dalvik .system.NativeStart.main (Método nativo) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): Causado por: java.io.NotSerializableException: com.rigidbits.test.TestActivity 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream. Java: 1847) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : En java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeFieldValues (ObjectOutputStream.java:1143) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java:413) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream .writeHierarchy (ObjectOutputStream.java: 1241) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1575) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at Java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10 20: 05: 51.895: E / AndroidRuntime (30.317): … 16 más
Cuando comento la línea en el método onSaveInstanceState
para que el objeto Data
no se guarde, la aplicación desaparece correctamente.
¿Alguna ayuda con esto?
Ok, creo que el problema es que está utilizando una clase privada interna .
Por lo tanto, tiene acceso a los métodos y campos de su clase externa, es decir, su actividad.
Debido a que su actividad no es serializble ( y por lo que no debe ser ), su obtener su excepción.
Una instancia de InnerClass sólo puede existir dentro de una instancia de OuterClass y tiene acceso directo a los métodos y campos de su instancia de inclusión.
Hay dos soluciones.
-
Haga su clase interna estática
-
Mover a su clase interna para ser una clase propia y declararla pública
Estas soluciones hacen que su clase Data
una clase por derecho propio y luego no necesita que su instancia de actividad exista
Referencia: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html