どのようにバンドルをシリアル化するには?

? hermo @ | Original: StackOverFlow

私は、バンドルオブジェクトをシリアル化したいのですが、それを行うための簡単な方法を見つけるように見えることはできません。私はファイルにシリアライズされたデータを保存したいので、小包を使用すると、オプションのようには思えない。

方法上の任意のアイデアは、これを行うには?

私はこれをしたい理由は、それがユーザーによって殺さだ場合にも、保存して、私の活動の状態を復元することです。私はすでに私がonSaveInstanceStateに保存したい状態とのバンドルを作成します。アクティビティがシステムによって殺されたときしかし、 Androidは唯一このバンドルを保持します。ユーザーがアクティビティを殺すとき、私はそれを自分自身を格納する必要があります。そこで私は、シリアル化し、それをファイルに保存したいと思います。あなたが同じことを達成するための他の方法を持っている場合はもちろん、私もそのために感謝すると思います。

編集: 私の代わりにバンドルのhttp://developer.android.com/intl/fr/reference/org/json/JSONObject.htmlとして私の状態を符号化することを決めた。 JSONオブジェクトは、直列化などのバンドルに入れて、またはファイルに保存することができます。おそらくない最も効率的な方法は、それはシンプルだし、それは大丈夫動作するように思われる。



Top 5 Respuesta

1snctln @

私はその制限を回避するためにhttp://developer.android.com/reference/android/content/SharedPreferences.htmlを使用し、それが同じputXXX ()とのgetXXX ( )バンドル·クラスが行うと、データの格納と取得のスタイルを使用していますあなたが前にバンドルを使用している場合は、実装することは比較的簡単です。

だからのonCreateで私はこのようなチェックを持っている

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

私は) ( onRestoreInstanceStateでバンドルからonSaveInstanceStateでバンドル() 、および負荷データに私のゲームデータを保存する

AND

私も) ( onResumeでSharedPreferencesからはonPauseでSharedPreferences () 、および負荷データにゲームデータを保存する

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の不適切な使用であると感じた場合、私は驚かないだろうが、それは仕事を取得します。私は一年以上のすべての私のゲーム( 200万ダウンロード)で、このメソッドを使用しているとそれが動作します。



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