在android中保存持久内部的数据对象列表

时间:2015-01-15 17:17:15

标签: java android serialization save

我有一个包含很多对象的课程,比如

private class MyDataStuff{

    private String mostInterestingString;
    private int    veryImportantNumber
    //...you get the idea

    public MyDatastuff{
    //init stuff...
    }

    //some getter methods        

}

此外我有一个类,我们称之为User,其中包含MyDataStuff列表,一些长号,字符串等。 我想将User的对象存储到内部存储器上的文件中。我尝试使用以下代码:

//loading
try{
        FileInputStream fis = this.getApplicationContext().openFileInput("UserData.data");
        ObjectInputStream is = new ObjectInputStream(fis);
        User loadedUser = (User) is.readObject();
        is.close();
        fis.close();
        appUser = loadedUser;
    }catch (Exception e){
        Log.e("MainActivity", "Error: loading from the internal storage failed - \n" + e.toString());

}
//Saving
if(appUser == null){
    Log.e("MainActivity", "Create new User");
    appUser = new User();
    try{
        FileOutputStream fos = this.getApplicationContext().openFileOutput("UserData.data", Context.MODE_PRIVATE);
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(this);
        os.close();
        fos.close();
    }catch (Exception e){
        Log.e("MainActivity", "Error: Failed to save User into internal storage - \n" + e.toString());
    }
}

这导致java.io.NotSerializableException。我阅读了Serializable文档并制作完成 testwise类用户实现Serializable并删除除longs和Strings之外的每个属性。 它仍然会导致这个异常,这让我相信字符串或长片默认也不可序列化。

我需要将对象保存在当前状态。做我想做的事情是否有更好的方法, 如果没有,我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

仔细查看序列化代码。

//Saving
if(appUser == null){
    Log.e("MainActivity", "Create new User");
    appUser = new User();
    try{
        FileOutputStream fos = this.getApplicationContext()
                .openFileOutput("UserData.data", Context.MODE_PRIVATE);
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(this);
        ...

您正在创建一个新的User对象,但是您要序列化this,我猜这是ActivityFragment。因此,您收到了NotSerializableException

StringLong可以序列化,没有任何问题。但是,如果您的最终User实施具有MyDataStuff列表,则您还必须标记其类Serializable

答案 1 :(得分:0)

你需要编写appUser对象而不是"这个"如果要存储用户对象。