2011-05-05 15 views
7

Soy consciente de las diferencias de rendimiento entre Parcelable (rápido) y Serializable (lento). Sin embargo, necesito almacenar cierta información de la aplicación de manera persistente, no solo dentro de un ciclo de vida, por lo tanto, onSaveInstanceState y los métodos asociados que utilizan objetos Parcelable no son apropiados.Android: Cualquier atajo a Serializable de Parcelable sin usar marshall()?

así que di vuelta a mi atención Serializable. Principalmente tengo AbstractList tipos para almacenar, lo cual está bien, ya que implementan Serializable. Sin embargo, muchos de los tipos que almaceno dentro de estos son Parcelable pero no Serializable, p. RectF.

pensé "no hay problema", ya que puede generar fácilmente un paquete a través de Parcelable.writeToParcel(parcel, flags) luego llamar marshall() en él para crear un byte[] que puedo serializar y deserializar. Pensé que usaría genéricos; crear una clase SerializableParcelable<Parcelable> implements Serializable, lo que permite una solución única para todos los tipos Parcelable que deseo serializar. Entonces yo, por ejemplo, almacenar cada RectF dentro de este envoltorio dentro ArrayList, y lo-y-he aquí la lista y sus contenidos son Parcelable serializable.

Sin embargo, los documentos de la API afirman que marshall() no debe ser utilizado para el almacenamiento persistente:

último byte pública [] Marshall()

devuelve los bytes sin formato de la parcela.

Los datos que se recuperan aquí no deben estar en ningún tipo de almacenamiento persistente (en el disco local, a través de una red, etc.). Para eso, debe usar la serialización estándar u otro tipo de mecanismo de serialización general. La representación ordenada de Parcel está altamente optimizada para IPC local y, como tal, no intenta mantener la compatibilidad con los datos creados en diferentes versiones de la plataforma.

Así que ahora estoy atascado. Puedo ignorar ya sea esta advertencia y seguir la ruta que he descrito anteriormente, o bien eludir el problema mediante la extensión de cada individuo Parcelable quiero serializar y la creación de métodos de serialización a medida, lo que parece muy inútil de tiempo y esfuerzo.

¿Alguien sabe de un atajo 'correcto' para serializar un objeto Parcelable sin usar marshall()? ¿O debo arar sin prestar atención a la advertencia especificada? Tal vez una base de datos SQLite es el camino a seguir, pero no estoy seguro y me gustaría su consejo.

Muchas gracias.

+0

¿Hay alguna razón por la cual no puede utilizó 'SharedPreferences' para almacenar los datos persistentes? Oh, espera, la respuesta es obvia, lo siento! –

+2

SharedPreferences solo ofrece métodos para el almacenamiento persistente de tipos simples como int, String, etc. No hay funcionalidad para almacenar un Parcelable, Serializable o byte []. – KomodoDave

+0

Sí, me acabo de dar cuenta de eso./o \ –

Respuesta

-1

Para cualquier objeto que necesite serializar, puede usar objectOutPutStream. Al usar esto, puede escribir objetos en el sistema de archivos del dispositivo. Por lo tanto, puede guardar objetos Parcelable también.

A continuación se muestra el código para guardar objetos de sistema de archivos.

public static void witeObjectToFile(Context context, Object object, String  filename) { 

    ObjectOutputStream objectOut = null; 
    FileOutputStream fileOut = null; 
    try { 
     File file = new File(filename); 
     if(!file.exists()){ 
      file.createNewFile(); 
     } 
     fileOut = new FileOutputStream(file,false); 
     objectOut = new ObjectOutputStream(fileOut); 
     objectOut.writeObject(object); 
     fileOut.getFD().sync(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    }finally { 
     if (objectOut != null) { 
      try { 
       objectOut.close(); 
      } catch (IOException e) { 
       // do nowt 
      } 
     } 
     if (fileOut != null) { 
      try { 
       fileOut.close(); 
      } catch (IOException e) { 
       // do nowt 
      } 
     } 
    } 
}` 

finde para leer el uso de objetos ObjectInputStream. Encuentra el código a continuación.

public static Object readObjectFromFile(Context context, String filename) { 

    ObjectInputStream objectIn = null; 
    Object object = null; 
    FileInputStream fileIn = null; 
    try { 
     File file = new File(filename); 
     fileIn = new FileInputStream(file);//context.getApplicationContext().openFileInput(filename); 
     objectIn = new ObjectInputStream(fileIn); 
     object = objectIn.readObject(); 

    } catch (FileNotFoundException e) { 
     // Do nothing 
    }catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    }finally { 
     if (objectIn != null) { 
      try { 
       objectIn.close(); 
      } catch (IOException e) { 
       // do nowt 
      } 
     } 
     if(fileIn != null){ 
      try { 
       fileIn.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    return object; 
}` 

Saludos,
Sha

+3

Sha le falta el punto de que ObjectOutputStream.writeObject (object) lanzará un error no serializable si el objeto no está declarado Serilizable. Esta es la raíz completa de los problemas que describe @KomodoDaveis. Parcelables no son necesariamente serializables. Estoy luchando con el mismo problema, tratando también de persistir los objetos intencionados que tienen paquetes. –

Cuestiones relacionadas