Como serializar um Bundle ?

? hermo @ | Original: StackOverFlow

Eu gostaria de serializar um objeto Bundle, mas não consigo encontrar uma maneira simples de fazê-lo . Usando Parcel não parece ser uma opção, desde que eu quero para armazenar os dados serializados para o arquivo.

Todas as idéias sobre maneiras de fazer isso?

A razão que eu quero isso é salvar e restaurar o estado da minha atividade, também quando é morto pelo usuário. Eu já criar um pacote com o estado em que deseja salvar no onSaveInstanceState . Mas android só mantém esta Bundle quando a atividade é morto pelo sistema. Quando o usuário mata a atividade, eu preciso armazená-lo eu mesmo. Por isso eu gostaria de serializar e armazená-lo para o arquivo. Claro que, se você tiver qualquer outra forma de conseguir a mesma coisa, eu seria grato por isso também.

Edit: Decidi codificar meu estado como um http://developer.android.com/intl/fr/reference/org/json/JSONObject.html em vez de um Bundle. O objeto JSON pode então ser colocado em um Bundle como Serializable, ou armazenadas em arquivo. Provavelmente não é a forma mais eficiente, mas é simples, e ele parece funcionar ok.

Top 5 Responder

1snctln @

Eu uso http://developer.android.com/reference/android/content/SharedPreferences.html para contornar essa limitação, ele usa o mesmo putXXX () e getXXX () estilo de armazenamento e recuperação de dados como a classe Bundle faz e é relativamente simples de implementar se você tiver usado um Bundle antes.

Assim, em onCreate Eu tenho um cheque como este

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

Eu salvar meus dados de jogos a um Bundle em onSaveInstanceState (), e carregar dados a partir de um Bundle em onRestoreInstanceState ()

AND

Eu também salvar dados do jogo para SharedPreferences em onPause () e carregar dados de SharedPreferences em 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));
}

Eu não ficaria surpreso se algumas pessoas se sentem este é um uso incorrecto da SharedPreferences, mas ele começa o trabalho feito. Tenho vindo a utilizar este método em todos os meus jogos ( cerca de 2 milhões de downloads ) para mais de um ano e ele funciona.

2reflog @

armazenar qualquer Parcelable para um arquivo é muito 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 @

Converta-o em 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;
}