Wie man ein Bundle serialisieren ?

? hermo @ | Original: StackOverFlow

Ich möchte ein Bundle -Objekt serialisiert, aber kann nicht scheinen, um eine einfache Möglichkeit, es zu tun zu finden. Mit Parcel nicht wie eine Option erscheinen, da möchte ich die serialisierten Daten speichern in einer Datei.

Alle Ideen, Möglichkeiten, dies zu tun?

Der Grund, warum ich dies zum Speichern und Wiederherstellen den Zustand meiner Tätigkeit, auch wenn es vom Benutzer umgebracht. Ich habe schon schaffen ein Bundle mit dem Staat Ich möchte in onSaveInstanceState speichern. Aber android hält nur dieses Bundle, wenn die Aktivität wird durch das System umgebracht. Wenn der Benutzer die Aktivität tötet, muss ich es mir selbst zu speichern . Daher ich möchte serialisieren und speichern Sie es in eine Datei. Natürlich, wenn Sie irgendeine andere Weise vollbringen die gleiche Sache zu haben, würde ich dankbar dafür zu sein .

edit: Ich beschloss, meinen Zustand als http://developer.android.com/intl/fr/reference/org/json/JSONObject.html anstelle eines Bundle zu kodieren. Die JSON-Objekt kann dann in einem Bundle als Serializable gestellt werden, oder in einer Datei gespeichert . Wahrscheinlich nicht der effizienteste Weg, aber es ist einfach, und es scheint zu funktionieren ok .

Top 5 Antwort

1snctln @

Ich benutze http://developer.android.com/reference/android/content/SharedPreferences.html um diese Einschränkung zu umgehen, die gleiche putXXX () und getXXX () Stil Speichern und Abrufen von Daten, die Bundle -Klasse macht und nutzt sie ist relativ einfach zu implementieren, wenn Sie ein Paket verwendet haben .

So in onCreate Ich habe eine Prüfung wie folgt

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

Ich meine Spieldaten zu speichern, um ein Bundle in onSaveInstanceState () und Laden von Daten aus einem Bundle in onRestoreInstanceState ()

AND

Ich habe auch Spieldaten speichern SharedPreferences in onPause (), und Daten von SharedPreferences in 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));
}

Ich wäre nicht überrascht, wenn einige Leute denken, dass dies eine falsche Verwendung von SharedPreferences, aber es ist die Arbeit getan wird . Ich habe mit dieser Methode in alle meine Spiele ( fast 2 Millionen Downloads) seit über einem Jahr und es funktioniert.

2reflog @

Speicherung einer beliebigen Parcel in eine Datei ist sehr einfach :

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 @

Wandelt es in 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;
}