0

文字列の4つの配列リストを含む永続的なシリアル化可能なオブジェクトを格納するAndroidアプリがあります。このオブジェクトは内部メモリに保存され、アプリが起動するたびに復元されます。それは正常に動作します....問題は、市場でアプリの新しいバージョンを起動し、ユーザーが新しいバージョンをダウンロードしてインストールすると、保存されたオブジェクトが適切に回復されず、オブジェクトの4つの配列リストが空で回復されることです. その後、ユーザーは以前のバージョンのアプリに保存されたデータを失いました。これは私が解決しなければならない大きな問題です。

これは私のシリアライズ可能なオブジェクトです:

public class SaveState implements Serializable{
    public ArrayList <String> fNumbers = new ArrayList<String>();
    public ArrayList <String> fNames = new ArrayList<String>(); 
    public ArrayList <String> favNumbers = new ArrayList<String>();
    public ArrayList <String> favNames= new ArrayList<String>();
    public static SaveState instance=new SaveState();
}

これらは、この永続オブジェクトを保存および回復するために使用する方法です。

public static void saveData(Context context){
        ObjectOutput out;
        try {           
            File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos.
            File outFile = new File(directory, "appSaveState.data");
            System.out.println("########## SAVING INTO: "+outFile.getAbsolutePath());
            out = new ObjectOutputStream(new FileOutputStream(outFile)); 
            out.writeObject(SaveState.instance);
            out.close();
        } catch (Exception e) {e.printStackTrace();}
    }

    public static void loadData(Context context){
        ObjectInput in;
        try {
            File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos.
            File inFile = new File(directory, "appSaveState.data"); 
            System.out.println("########## LOADING FROM: "+inFile.getAbsolutePath());
            in = new ObjectInputStream(new FileInputStream(inFile)); //intentamos cargar el fichero     
            SaveState.instance=(SaveState) in.readObject();
            in.close();
        } catch (Exception e) {e.printStackTrace();}
    }

アプリのバージョンが更新されていない場合、このコードは正常に機能することに注意してください。

なにが問題ですか?アプリのさまざまな Android マーケット バージョン間でこのデータを永続化するにはどうすればよいですか?

ありがとう

4

1 に答える 1

0

私は自分でデータをシリアライズし、Java オブジェクトのシリアライゼーションには依存しません。

オブジェクトを ObjectOutputStream に書き込む代わりに、データを XML ドキュメントに変換し、そのファイルをストレージに書き込むことができます (とにかくすべて文字列なので、難しくはないはずです)。次に、XML の処理に使用できるクラスを使用して、データの読み取りと書き込みを行うことができます。この場合、ディスク上のデータは、使用しているプログラムのどのバージョンでも常に読み取ることができることがわかります。

Java シリアライゼーションの問題は、リフレクションに大きく依存していることと、基礎となるクラスの実装が変更された場合に困惑することです。

于 2012-08-02T09:01:42.787 に答える