4

我有这个可序列化的类,我用它在二进制文件中存储字符串的 ArrayList。

public class SaveState implements Serializable{
   public static ArrayList <String> favoriteBusStopNumbers = new ArrayList<String>();
   public static SaveState instance=new 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.instance);
        out.close();
    } catch (Exception e) {e.printStackTrace();}
}

最后,我在我的应用程序的初始化中使用此方法来加载文件并用以前存储的数据填充我的 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/

这里最好的解决方案是重新考虑您的数据结构,如果它保存对象的状态,则使数组列表成为非静态的。

编辑:或者,您可以只序列化数组列表(如下@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 回答