Comment sérialiser un Bundle ?

? hermo @ | Original: StackOverFlow

Je aimerais sérialiser un objet Bundle, mais ne arrive pas à trouver un moyen simple de le faire . Utilisation de la parcelle ne semble pas être une option, puisque je veux stocker les données en série à déposer .

Toutes les idées sur les moyens de le faire?

La raison pour laquelle je veux que ce est de sauver et restaurer l'état de mon activité, également quand il est tué par l'utilisateur . Je crée déjà un Bundle avec l'état où je veux sauver dans onSaveInstanceState . Mais Android ne conserve ce Bundle lorsque l'activité est tué par le système . Lorsque l'utilisateur tue l'activité, je ai besoin de stocker moi-même. Ce est pourquoi je tiens à la sérialisation et la stocker dans un fichier. Bien sûr, si vous avez une autre façon d'accomplir la même chose, je serais reconnaissant pour cela aussi.

edit: Je ai décidé de coder mon état comme http://developer.android.com/intl/fr/reference/org/json/JSONObject.html au lieu d'un Bundle . L'objet JSON peut alors être mis dans un Bundle comme Serializable, ou stocké dans un fichier. Probablement pas le moyen le plus efficace, mais ce est simple, et il semble fonctionner ok .

Top 5 Répondre

1snctln @

Je utilise http://developer.android.com/reference/android/content/SharedPreferences.html de contourner cette limitation, il utilise le même putXXX ( ) et getXXX ( ) style de stocker et récupérer des données que la classe Bundle fait et est relativement simple à mettre en œuvre si vous avez utilisé un Bundle avant .

Donc, en onCreate Je ai un chèque de ce type

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

Je économise mes données de jeu à un Bundle onSaveInstanceState ( ), et charger des données à partir d'un Bundle onRestoreInstanceState ( )

AND

Je économise également des données de jeu pour SharedPreferences dans OnPause ( ), et charger les données de SharedPreferences dans 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));
}

Je ne serais pas surpris si certaines personnes estiment que ce est une mauvaise utilisation de SharedPreferences, mais il fait le travail . Je ai utilisé cette méthode dans tous mes jeux ( près de 2 millions de téléchargements ) pour plus d'un an et il fonctionne .

2reflog @

stocker toute Parcelable à un fichier est très simple:

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