4

私はこのシリアル化可能なクラスを持っています。これは、バイナリ ファイルに文字列の ArrayList を格納するために使用します。

public class SaveState implements Serializable{
   public static ArrayList <String> favoriteBusStopNumbers = new ArrayList<String>();
   public static SaveState instance=new SaveState();
}

この配列が保存する必要があるデータでいっぱいになったら、このメソッドを使用して、文字列のarrayListでインスタンスを保存します。

public static void saveData(){
    ObjectOutput out;
    try {
        //primero comprobamos si existe el directorio, y si no, lo creamos.
        File folder = new File(Environment.getExternalStorageDirectory() + DIRECTORY_NAME);
        if(!folder.exists())
            folder.mkdirs();

        File outFile = new File(Environment.getExternalStorageDirectory(), DIRECTORY_NAME+"appSaveState.data");
        out = new ObjectOutputStream(new FileOutputStream(outFile)); 
        out.writeObject(SaveState.instance);
        out.close();
    } catch (Exception e) {e.printStackTrace();}
}

最後に、アプリの init でこのメソッドを使用してファイルを読み込み、SaveState.instance 変数に以前に保存したデータを入力します。

public static void loadData(){
    ObjectInput in;
    try {
        File inFile = new File(Environment.getExternalStorageDirectory(), DIRECTORY_NAME+"appSaveState.data");
        in = new ObjectInputStream(new FileInputStream(inFile));        
        SaveState.instance=(SaveState) in.readObject();
        in.close();
    } catch (Exception e) {e.printStackTrace();}
}

データを保存すると、ファイルはデータのオブジェクト フィルで正しく作成されています。ファイルのディスク容量が 0KB を超えているためです。しかし、アプリを起動してデータをロードすると、SaveState.instance 変数が文字列の空の ArrayList を取得するため、ここで何か問題が発生しています。コードの何が問題なのですか?

ありがとう

4

3 に答える 3

6

あなたの配列リストは静的です。静的変数は、オブジェクトではなくクラスに関連付けられています。したがって、それらはシリアル化されません。

静的変数をシリアライズしたい場合は、readObject と writeObject をオーバーライドする必要があります。

ここにいくつかの追加情報があります - http://java.sun.com/developer/technicalArticles/Programming/serialization/

ここでの最善の解決策は、データ構造を再考し、オブジェクトの状態を保存する場合は arraylist を非静的にすることです。

編集: または、配列リストのみをシリアル化することもできます (@Ted が以下で提案するように)

于 2012-07-24T21:55:43.767 に答える
3

問題は、静的としてマークされた変数は、実装しない限りシリアル化されないことです

private void readObject(ObjectInputStream ois){}  

private void writeObject(ObjectOutputStream oos){}

ObjectOutputStream - JavaDoc:

オブジェクトのデフォルトのシリアライゼーション メカニズムは、オブジェクトのクラス、クラス シグネチャ、すべての非一時的および非静的フィールドの値を書き込みます。

于 2012-07-24T22:00:48.917 に答える
1

保持される唯一のデータSaveStateは静的配列であるため、配列をシリアル化および逆シリアル化するだけでより多くの成功を収めることができます。

public static void saveData(){
    ObjectOutput out;
    try {
        //primero comprobamos si existe el directorio, y si no, lo creamos.
        File folder = new File(Environment.getExternalStorageDirectory() + DIRECTORY_NAME);
        if(!folder.exists())
            folder.mkdirs();

        File outFile = new File(Environment.getExternalStorageDirectory(), DIRECTORY_NAME+"appSaveState.data");
        out = new ObjectOutputStream(new FileOutputStream(outFile)); 
        out.writeObject(SaveState.favoriteBusStopNumbers);
        out.close();
    } catch (Exception e) {e.printStackTrace();}
}

@SuppressWarnings("unchecked")
public static void loadData(){
    ObjectInput in;
    try {
        File inFile = new File(Environment.getExternalStorageDirectory(), DIRECTORY_NAME+"appSaveState.data");
        in = new ObjectInputStream(new FileInputStream(inFile));
        SaveState.favoriteBusStopNumbers=(ArrayList<String>) in.readObject();
        in.close();
    } catch (Exception e) {e.printStackTrace();}
}

(ジェネリック型へのキャストに関する警告を抑制する必要があります。)

SaveState.instanceフィールドはまったく必要ありません。

于 2012-07-24T21:59:51.740 に答える