Come serializzare un bundle ?

? hermo @ | Original: StackOverFlow

Mi piacerebbe serializzare un oggetto Bundle, ma non riesco a trovare un modo semplice per farlo . Utilizzando Parcel non sembra un'opzione, perché voglio per memorizzare i dati serializzati in un file.

Tutte le idee sui modi per fare questo ?

Il motivo che voglio è quello di salvare e ripristinare lo stato della mia attività, anche quando è ucciso dall'utente . Ho già creare un pacchetto con lo Stato voglio salvare in onSaveInstanceState . Ma Android mantiene solo questo Bundle quando l'attività viene ucciso dal sistema. Quando l'utente uccide l'attività, ho bisogno di memorizzare io stesso . Quindi mi piacerebbe serializzare e conservarlo in un file . Naturalmente, se si dispone di un altro modo di realizzare la stessa cosa, mi piacerebbe essere grati anche per questo .

Edit : Ho deciso di codificare il mio stato come http://developer.android.com/intl/fr/reference/org/json/JSONObject.html invece di un Bundle . L'oggetto JSON può quindi essere messo in un bundle come serializzabile, o memorizzati in un file. Probabilmente non è il modo più efficiente, ma è semplice, e sembra funzionare bene .

Top 5 Risposta

1snctln @

Io uso http://developer.android.com/reference/android/content/SharedPreferences.html per aggirare questa limitazione, si usa lo stesso putXXX ( ) e getXXX ( ) stile di archiviare e recuperare dati come la classe Bundle fa e è relativamente semplice da realizzare se si è utilizzato un Bundle prima .

Così in onCreate ho un assegno come questo

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

Salvare i dati di gioco per un Bundle a onSaveInstanceState ( ), e caricare dati da un Bundle a onRestoreInstanceState ( )

AND

Ho anche salvare i dati di gioco per SharedPreferences in onPause ( ), e caricare i dati da SharedPreferences a 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));
}

Non sarei sorpreso se alcune persone si sentono questo è un uso non corretto del SharedPreferences, ma ottiene il lavoro fatto . Ho usato questo metodo in tutti i miei giochi ( quasi 2 milioni di download ) per oltre un anno e funziona .

2reflog @

memorizzare qualsiasi Parcelable un file è molto semplice :

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 @

Convertirlo 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;
}