【问题标题】:How can I save an ArrayList<MyObject> to a file?如何将 ArrayList<MyObject> 保存到文件中?
【发布时间】:2017-03-25 23:19:08
【问题描述】:

如何将 ArrayList 保存到文件中? 我在做什么?ng?

我已经使用这个 SO 问题来帮助我处理可序列化的对象。:

how to serialize ArrayList on android

我使用了这个关于如何编写数组列表的问题:

Java - How Can I Write My ArrayList to a file, and Read (load) that file to the original ArrayList?

但是,当我尝试将 写入文件时,我得到了错误:

java.io.NotSerializableException: 在

java.io.ObjectOutputStream.writeObject at

com.mycompany.MyClass.saveData

这是尝试保存文件的 MyClass

private ArrayList < MyCustomObject > arrayList;
private File dataFile;
private String FILE_NAME = "FILE_DATA.dat";

public void init(final Context context) {
    this.appContext = context;

    dataFile = new File(appContext.getFilesDir(), FILE_NAME);

    if (dataFile.exists()) {
        loadData();

    } else {

        try {
            dataFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        arrayList = new ArrayList < MyCustomObject > ();
saveData();
   }

}


private void saveData() {
    FileOutputStream fos = null;

    try {
        fos = new FileOutputStream(dataFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {

        if (fos != null) {

            ObjectOutputStream oos = null;
            try {

                oos = new ObjectOutputStream(fos);

                if (oos != null) {

                    oos.writeObject(arrayList);

                }
                assert oos != null;
                oos.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

private void loadData() {

    FileInputStream fis = null;
    try {
        fis = new FileInputStream(dataFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {

        if (fis != null) {

            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(fis);

                if (ois != null) {

                    try {

                        arrayList = (ArrayList < MyCustomObject > ) ois.readObject();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {

                }
                assert ois != null;
                ois.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

这是我的自定义对象

public class MyCustomObject implements Serializable {

    public String myname = "";
    public String someOtherItem = "";
    public int aNumber = 0;
    public MyCustomObject getCustomObject() {
        return this;
    }
}

【问题讨论】:

  • 您要序列化什么 - MyClass 实例的 arrayList 成员变量,还是 MyClass 实例本身?
  • 我想我应该序列化我的 ArrayList,因为那是需要保存的。
  • 确实 - MyClass 似乎有一个 Context 成员(请参阅init 方法中的 this.appContext),这肯定是可序列化的!
  • 既然 MyCustomObject 是可序列化的,那么 ArrayList 不也可以通过继承实现序列化吗?它实际上是一个可序列化对象的列表。
  • 啊!好的,让我快速阅读。

标签: java android arraylist fileoutputstream objectoutputstream


【解决方案1】:

替换此方法

 public MyCustomObject MyCustomObject() {
        return this;
 }

在您的 MyCustomObject 类中,您的代码应该可以正常工作。使用类似的东西

 public MyCustomObject getMyCustomObject() {
        return this;
 }

因为当您自己不提供构造函数时,您命名方法的方式与 java 为 MyCustomObject 类创建的默认构造函数冲突。 我假设您使用此方法能够将 MyCustomObject 的一个实例添加到您的数组列表中:您实际上并不需要这样的方法,但是通过正确的命名您仍然可以使用它。

您还应该通过调用 saveData() 方法将示例数据放入 ArrayList 中,然后再将其保存到磁盘。

这是您的代码中有效的插图。我不确定你的 Context 对象到底是什么,但你正在使用它来访问文件路径,所以为了让事情顺利进行,我只使用了一个特定的文件路径。

public class MyClass {
    private ArrayList < MyCustomObject > arrayList;
    private File dataFile;
    private String FILE_NAME = "FILE_DATA.dat";

    public void init(final Context context) {


        dataFile = new File("C:\\lompo\\file1.txt");

        if (dataFile.exists()) {
            loadData();

        } else {

            try {
                dataFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            arrayList = new ArrayList < MyCustomObject > ();
            MyCustomObject obj1 = new MyCustomObject();
            obj1.aNumber = 125;
            obj1.myname = "HIS NAME";
            arrayList.add(obj1);
            saveData();
       }

    }

    public static void main(String[] args) {
        MyClass myClazz = new MyClass();
        myClazz.init(null);

        System.out.println("Arraylist has " + myClazz.arrayList.size() + " elements");
    }

    private void saveData() {
        FileOutputStream fos = null;

        try {
            fos = new FileOutputStream(dataFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {

            if (fos != null) {

                ObjectOutputStream oos = null;
                try {

                    oos = new ObjectOutputStream(fos);

                    if (oos != null) {

                        oos.writeObject(arrayList);

                    }
                    assert oos != null;
                    oos.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    private void loadData() {

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(dataFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {

            if (fis != null) {

                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(fis);

                    if (ois != null) {

                        try {

                            arrayList = (ArrayList < MyCustomObject > ) ois.readObject();
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                    } else {

                    }
                    assert ois != null;
                    ois.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

正如您在代码中看到的,main 方法的第一次运行会将文件保存在磁盘上,其中包含一个由一个对象填充的 arrayList。第二次运行从文件中读取,然后我打印了之前保存的元素数量和信息:图片说明了结果

【讨论】:

  • 谢谢。让我根据你的建议来思考这个问题,我会回复你
  • @user-44651 你试过了吗?它对你有用吗?
  • 不,我仍然会在保存时收到java.io.NotSerializableException: W/System.err: at java.io.ObjectOutputStream.writeNewObject
  • 然后一旦创建文件,如果应用程序重新启动我得到Read an exception; java.io.NotSerializableException: W/System.err: at java.io.ObjectInputStream.readNonPrimitiveConten
  • 真的吗?您是否更改了 MyCustomObject 类中的 MyCustomObject MyCustomObject() 方法的名称?
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2012-12-04
  • 2015-04-30
  • 2016-10-28
  • 1970-01-01
  • 2015-09-26
  • 2017-06-04
相关资源
最近更新 更多