Как сериализовать комплект ?

? hermo @ | Original: StackOverFlow
---

Я хотел бы сериализовать объект Bundle, но не могу показаться, чтобы найти простой способ сделать это. Использование посылок не кажется вариант, так как я хочу, чтобы хранить сериализованных данных в файл.

Любые идеи о путях это сделать?

Поэтому я хочу, это, чтобы сохранить и восстановить состояние моей деятельности, а также, когда это убил пользователем. Я уже создать пакет с государством я хочу сохранить в onSaveInstanceState . Но Android только сохраняет это расслоение, когдадеятельность убит системы. Когдапользователь убивает свою деятельность, Мне нужно хранить его сам . Поэтому я хотел бы для сериализации и сохранить его в файл . Конечно, если у вас есть какие-либо другой способ выполнения то же самое, я бы благодарны за это.

Изменить: Я решил кодировать мое состояние как http://developer.android.com/intl/fr/reference/org/json/JSONObject.html вместо пучка. Объект JSON может быть помещен в Bundle какSerializable или храниться в файл. Наверное, несамый эффективный способ, но это просто, и это, кажется, работает нормально.

---

Top 5 ответ

1snctln @

Я использую http://developer.android.com/reference/android/content/SharedPreferences.html, чтобы обойти это ограничение, он использует тот же putXXX () и getXXX () стиль хранения и извлечения данных, каккласс Bundle делает и относительно прост в реализации, если вы использовали Bundle раньше.

Таким образом, в OnCreate у меня есть чек, как это

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

Сохранить данные игры, чтобы узелком в onSaveInstanceState (), и загрузить данные из пучка в onRestoreInstanceState ()

AND

Я также сохранить данные игры, чтобы SharedPreferences в OnPause () и загрузки данных из SharedPreferences в 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));
}

Я не удивлюсь, если некоторые люди считают, что этонеправильное использование SharedPreferences, но он получает работу. Я использую этот метод во всех моих игр ( почти 2 миллионов загрузок) в течение года, и она работает .

2reflog @

сохранения каких-либо Parcelable в файл очень просто:

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 @

Привести его к 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;
}