2011-03-09 14 views
5

La instalación deClassNotFoundException en clase serializable durante la actividad comenzará

tengo una actividad que sólo se anula onCreate(), onResume(), y onSaveInstanceState(). En onSaveInstanceState(), pongo en un objeto serializable:

@Override 
    public void onSaveInstanceState(Bundle state) { 
     super.onSaveInstanceState(state); 
     state.putSerializable("obj", myObj); // myObj is of class MyClass    state.putLong("long", longVar); 
    } 

MiClase fue originalmente una clase interna dentro de la clase de actividad, pero para la depuración, que incluso se trasladó a un archivo separado:

public class MyClass implements Serializable { 
    private static final long serialVersionUID = 0x98ED2F00; 
    .... 
} 

los Pasos:

  1. iniciar el programa de la forma habitual, funciona muy bien.
  2. Haga clic en el botón de Inicio para volver al Iniciador.
  3. De Eclipse, detenga el proceso desde el panel de dispositivos
  4. a iniciar el programa de lanzador, esta vez me sale el siguiente:

    java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {com.example .Reports}: java.lang.RuntimeException parcelable encontraron ClassNotFoundException la lectura de un objeto serializable {name = com.example.MyClass}

    Causado por: java.lang.ClassNotFoundException: com.examp.MyClass en el cargador dalvik.System.PathClassLoader [.]

pistas y observaciones:

  1. La pista más importante es: si no la salvo myObj en onSaveInstanceState(), entonces todo está bien. Y, poner cualquier tipo primitivo en el Bundle está bien, pero no en mis objetos.

  2. La excepción se produce fuera de mi código, sucedió entre onCreate() y onResume(). Pasó dentro de Android.

  3. El nombre de la clase en el mensaje de error es correcto: com.example.MyClass. Originalmente era una clase interna dentro de la actividad, pero para aislar el problema, lo moví a un archivo separado, sin éxito.

  4. Creo que la implementación de Serializable es correcta, ya que se puede serializar a/desde un archivo en otras partes del programa.

¿Alguien tiene una idea de alguna posible causa de esto? ¡Muy apreciado! (Lo siento, no puedo poner código detallado aquí, porque todo está entrelazado aquí y allá. Solo puedo aislar tanto como sea posible.)

Respuesta

5

Bien, creo que encontré una solución a este problema.

Resultó que si el parámetro savedInstanceState pasado a onCreate() no es nulo, entonces DEBE deserializar cualquier objeto contenido en ese Bundle. No sé por qué, pero así es como me deshice del problema. Originalmente, mi código en onCreate() tiene la lógica de que bajo ciertas condiciones, ignoro el savedInstanceState.Ahora lo que hago es siempre que no sea nulo, deserializaré todo, luego, en base a otras condiciones, decido si las uso o no.

Hasta ahora funciona bien. Pero no tengo idea de:

  1. ¿Por qué tengo que deserializarlos, y si no, ocurre una excepción?

  2. ¿Qué estaba haciendo Android para deserializar mis cosas que puse en savedInstanceState? Quiero decir, entiendo que Android puede haber puesto algo de información para su propio uso, pero ¿por qué viene y trata de deserializar mis cosas? Si sabe que no sabe cómo usarlos?

+0

Muchas gracias por regresar e informar su solución. No puedo imaginar cuánto tiempo habría llevado imaginar esto, no es nada obvio – HXCaine

1

He estado luchando este mismo tema y la forma en que terminó la resolución era poner en práctica Parceable en lugar de Serializable en la clase que estaba escondiendo en el paquete.

Pude reproducir el bloqueo de manera confiable usando la aplicación DevTools en el emulador (no parece funcionar en un dispositivo real) y cambiando el Development Settings > Immediately destroy activities para comprobarlo. Cambiar mi clase personalizada a Parceable y cambiar a putParcelable en mi onSaveInstanceState pareció solucionar el problema.

Cuestiones relacionadas