Cómo serializar un paquete ?

? hermo @ | Original: StackOverFlow
---

Me gustaría serializar un objeto Bundle, pero parece que no puede encontrar una manera sencilla de hacerlo. El uso de la parcela no parece ser una opción, ya que quiero para almacenar los datos serializados en un archivo.

Cualquier ideas sobre maneras de hacer esto ?

La razón por la que quiero que esto es para guardar y restaurar el estado de mi actividad, también cuando es asesinado por el usuario . Ya puedo crear un paquete con el estado Quiero ahorrar en onSaveInstanceState . Pero androide sólo mantiene este paquete cuando la actividad es asesinado por el SISTEMA. Cuando el usuario se mata a la actividad, lo que necesito para almacenar yo mismo. Por lo tanto me gustaría serializar y almacenarla en un archivo. Por supuesto, si usted tiene cualquier otra manera de lograr lo mismo, estaría agradecido por eso también.

Editar: Me decidí a codificar mi estado como http://developer.android.com/intl/fr/reference/org/json/JSONObject.html en lugar de un paquete . El objeto JSON puede entonces ser puesto en un paquete como Serializable o almacena en un archivo. Probablemente no sea la manera más eficiente, pero es sencillo, y parece que funciona bien.

---

Top 5 Respuesta

1snctln @

Yo uso http://developer.android.com/reference/android/content/SharedPreferences.html para moverse esa limitación, se utiliza el mismo putXXX () y getXXX () estilo de almacenamiento y recuperación de datos como la clase Bundle hace y es relativamente fácil de implementar si usted ha usado un paquete antes.

Así que en onCreate tengo un cheque como este

if(savedInstanceState != null)
{
    loadGameDataFromSavedInstanceState(savedInstanceState);
}
else
{
    loadGameDataFromSharedPreferences(getPreferences(MODE_PRIVATE));
}

Puedo guardar mis datos del juego a un paquete en onSaveInstanceState (), y cargar los datos de un paquete en onRestoreInstanceState ()

AND

También puedo guardar los datos del juego a SharedPreferences en onPause (), y cargar datos desde SharedPreferences en onResume ()

onPause()
{
    // get a SharedPreferences editor for storing game data to
    SharedPreferences.Editor mySharedPreferences = getPreferences(MODE_PRIVATE).edit();

    // call a function to actually store the game data
    saveGameDataToSharedPreferences(mySharedPreferences);

   // make sure you call mySharedPreferences.commit() at the end of your function
}

onResume()
{
    loadGameDataFromSharedPreferences(getPreferences(MODE_PRIVATE));
}

No me sorprendería que algunas personas sienten que esto es un uso incorrecto de SharedPreferences, pero hace el trabajo . He estado usando este método en todos mis juegos ( casi 2 millones de descargas) durante más de un año y funciona.

2reflog @

almacenar cualquier parcelable a un archivo es muy fácil :

FileOutputStream fos = context.openFileOutput(localFilename, Context.MODE_PRIVATE);
Parcel p = Parcel.obtain(); // i make an empty one here, but you can use yours
fos.write(p.marshall());
fos.flush();
fos.close();

enjoy!

3asgoth @

Convertir a SharedPreferences :

private void saveToPreferences(Bundle in) {
    Parcel parcel = Parcel.obtain();
    String serialized = null;
    try {
        in.writeToParcel(parcel, 0);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        IOUtils.write(parcel.marshall(), bos);

        serialized = Base64.encodeToString(bos.toByteArray(), 0);
    } catch (IOException e) {
        Log.e(getClass().getSimpleName(), e.toString(), e);
    } finally {
        parcel.recycle();
    }
    if (serialized != null) {
        SharedPreferences settings = getSharedPreferences(PREFS, 0);
        Editor editor = settings.edit();
        editor.putString("parcel", serialized);
        editor.commit();
    }
}

private Bundle restoreFromPreferences() {
    Bundle bundle = null;
    SharedPreferences settings = getSharedPreferences(PREFS, 0);
    String serialized = settings.getString("parcel", null);

    if (serialized != null) {
        Parcel parcel = Parcel.obtain();
        try {
            byte[] data = Base64.decode(serialized, 0);
            parcel.unmarshall(data, 0, data.length);
            parcel.setDataPosition(0);
            bundle = parcel.readBundle();
        } finally {
            parcel.recycle();
        }
    }
    return bundle;
}