5
  Bundle bundle;
  //set data to bundle
  //......


  File file = new File(context.getFilesDir().getAbsolutePath()  + "/data/");
                FileOutputStream fos;
                try {
                     fos = new FileOutputStream(file);
                     //fos.write
                     fos.close();
                } catch (FileNotFoundException exp1) {
                    exp1.printStackTrace();
                } catch ( IOException exp2) {
                    exp2.printStackTrace();
                }

私は前述のコードを持っています。私がしたいのは、バンドルをファイルに保存することだけです。writeメソッドを見つけましたが、バンドルを渡すことができず、byte []のみです。バンドルをbyte[]に変換しようとしましたが、成功しませんでした。これを機能させるにはどうすればよいですか?最も効率的な方法は何ですか?

4

7 に答える 7

5

永続ストレージからバンドルを保存および復元する一般的な方法はありません。これは、Parcel クラスが Android バージョンの互換性を保証していないためです。だからシリアライズしないほうがいい。

ただし、本当に必要な場合は、Parceable インターフェイスを介して Bundle をシリアル化できます。bundle を Parcel に変換し (writeToParcel()/readFromParcel())、Parcel の marshall() メソッドと unmarshall() メソッドを使用して byte[] を取得します。バイト配列をファイルに保存/ロードします。ただし、ユーザーが Android OS を新しいバージョンに更新した場合、データを復元できなくなる可能性があります。

ObjectOutput/InputStream を使用してバンドルをシリアライズするには、正当ではあるが非常に面倒で信頼性の低い方法が 1 つあります。(すべてのキーを取得し、キーを繰り返し処理し、シリアル化可能なキー=値のペアをファイルに保存し、ファイルからキー=値のペアを読み取り、値の型を決定し、適切な putXXX(key, value) メソッドを介してデータを Bundle に戻します)それだけの価値はありません )

カスタムのシリアル化可能な構造を Bundle に入れて、必要なすべての値を保存し、この構造のみをファイルから保存/ロードすることをお勧めします。

または、Bundle を使用せずにデータを管理するためのより良い方法を見つけてください。

于 2013-01-10T11:36:34.157 に答える
3
Bundle in=yourBundle;
FileOutputStream fos = context.openFileOutput(localFilename, Context.MODE_PRIVATE);
Parcel p = Parcel.obtain(); //creating empty parcel object
in.writeToParcel(p, 0); //saving bundle as parcel 
fos.write(p.marshall()); //writing parcel to file
fos.flush();
fos.close();
于 2013-01-10T11:38:26.400 に答える
0

あなたはこのようなことをすることができます

public void write(String fileName, Bundle bundle)
    {
        File root = Environment.getExternalStorageDirectory();
        File outDir = new File(root.getAbsolutePath() + File.separator + "My Bundle");
        if (!outDir.isDirectory())
        {
            outDir.mkdir();
        }
        try
        {
            if (!outDir.isDirectory())
            {
                throw new IOException("Unable to create directory My bundle. Maybe the SD card is mounted?");


    }
        File outputFile = new File(outDir, fileName);
        writer = new BufferedWriter(new FileWriter(outputFile));
        String value=bundle.getString("key");
        writer.write(value);
        Toast.makeText(context.getApplicationContext(), "Report successfully saved to: " + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
        writer.close();
    } catch (IOException e)
    {
        Log.w("error", e.getMessage(), e);
        Toast.makeText(context, e.getMessage() + " Unable to write to external storage.", Toast.LENGTH_LONG).show();
    }

}

ここでは、アイデアは単純です。をこのメソッドに渡し、Bundleそこにあるデータを抽出して (この例では、キーを持つ文字列を持っていますkey)、それをファイルに書き込みます。

于 2013-01-10T11:37:32.203 に答える
0

バンドルをローカル ファイルに保存することはできません。Non Serialization Exception が発生します。保存する他のショートカットがある場合があります。元のオブジェクトを読み取って構築した後、100% 保証されるわけではありません。

于 2015-07-17T18:31:07.243 に答える
0

Bundleaを aに変換するのに役立つ関数を次に示します。バンドルにs とs のみJSONObjectが含まれている場合にのみ機能することに注意してください。intString

public static JSONObject bundleToJsonObject(Bundle bundle) {
    try {
        JSONObject output = new JSONObject();
        for( String key : bundle.keySet() ){
            Object object = bundle.get(key);
            if(object instanceof Integer || object instanceof String)
                    output.put(key, object);
            else
                throw new RuntimeException("only Integer and String can be extracted");
        }
        return output;
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }
}

public static Bundle JsonObjectToBundle(JSONObject jsonObject) {
    try {
        Bundle bundle = new Bundle();
        Iterator<?> keys = jsonObject.keys();
        while( keys.hasNext() ){
            String key = (String)keys.next();
            Object object = jsonObject.get(key);
            if(object instanceof String)
                bundle.putString(key, (String) object);
            else if(object instanceof Integer)
                bundle.putInt(key, (Integer) object);
            else
                throw new RuntimeException("only Integer and String can be re-extracted");
        }
        return bundle;
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }
}
于 2014-10-31T14:13:13.790 に答える