持久化ArrayList - 无法从Object转换为ArrayList

时间:2013-08-12 16:21:04

标签: android serialization android-listview arraylist

把头靠在墙上。我正在从Blackberry转换到Android。

我有一个需要保留日志的应用。它是一个简单的ArrayList,并不会那么大。它确实需要在应用程序重新启动之间保持等等。但它不够复杂,无法使用SQL。它需要在ListView中显示,因此ArrayList看起来最简单。

我似乎能够轻松地序列化和存储ArrayList。但是在读回来的时候,它就是炸弹,说我无法从Object转换为ArrayList。

我的计划是在获取实例时让日志对象(singleton)加载历史记录。然后我会用onDestroy()...

写一个文件

在黑莓手机上,这种事情很简单。我很惊讶你需要在Android上做多少工作。 Android上的其他所有内容似乎都更容易。我更喜欢将对象标记为Persistent并让系统为我管理它的方法。我知道你也不能轻易地将一个Object填充到SharedPreference中。

有人可以指出我哪里出错吗?我已经用几种方式重新布线了,但问题仍然存在。如果有更简单的方法,请告诉我们。

由于

我有:

public class DataLog implements Serializable {
    private static final long serialVersionUID = 0L;
    private static String fileName = "datalog.dat";

    private static ArrayList<String> log = null;

    static public ArrayList<String> getInstance() {
        if (log == null) {
            synchronized (DataLog.class) {
                if (log == null) {
                    log = new ArrayList<String>();
                }
            }
            load();
        }
        return log;
    }

    public DataLog() {
        super();
    }

    public boolean add(String entry) {
        return log.add(entry);
    }

    public void add(int index, String entry) {
        if (index > 0)
            log.add(index, entry);
        else
            log.add(entry);
        save();
    }

    public void clear() {
        log.clear();
    }
    public void save() {
        Persister.store(fileName, log);
    }

    public static void load() {
        log = (ArrayList<String>) Persister.restore(fileName);
    }
}

public class Persister {
    static Context context = ThisApplication.context;

    public Persister() {}

    public static boolean store(String fileName, Object obj){
        File file = context.getFileStreamPath(fileName);

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream(file);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(obj);
            oos.close();
            fos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return true;

    }
    public static Object restore(String fileName){
        File file = context.getFileStreamPath(fileName);
        Object obj = new Object();

        if(file.exists() && file.length()>0){
            FileInputStream fis = null;
            ObjectInputStream ois = null;
            try {
                fis = new FileInputStream(file);
                ois = new ObjectInputStream(fis);
                obj = ois.readObject();
                ois.close();
                fis.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
        }
        return obj;
    }
}

1 个答案:

答案 0 :(得分:0)

如果该文件不存在,那么Persister.restore实际上会返回new Object(),而ArrayList不是public static ArrayList<String> restore(String fileName){ File file = context.getFileStreamPath(fileName); ArrayList<String> obj = null; // returning null indicates error if(file.exists() && file.length()>0){ FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(file); ois = new ObjectInputStream(fis); obj = (ArrayList<String>) ois.readObject(); ois.close(); fis.close(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } else { obj = new ArrayList<String>(); } return obj; } 的实例。你可以这样做:

load()

然后,您可以从Persister.restore消除演员阵容(因为它现在位于public static void load() { log = Persister.restore(fileName); } ):

Persister.store()

我还会更改ArrayList<String>以接受明确的Object参数,而不是普通的public static boolean store(String fileName, ArrayList<String> obj){ // method body does not need to change }

ArrayList<String>

这样编译器就可以捕获任何编程错误,你尝试保留{{1}}以外的其他东西。