如何将 ArrayList<MyObject> 保存到文件中?

How can I save an ArrayList<MyObject> to a file?

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

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

how to serialize ArrayList on android

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

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

然而,当我尝试写入文件时出现错误:

java.io.NotSerializableException: at

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();
            }
        }
    }

}

这里是MyCustomObject

public class MyCustomObject implements Serializable {

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

替换此方法

 public MyCustomObject MyCustomObject() {
        return this;
 }

在您的 MyCustomObject class 中,您的代码应该可以正常工作。使用像

这样的东西
 public MyCustomObject getMyCustomObject() {
        return this;
 }

因为当您自己不提供构造函数时,您命名方法的方式与 java 为 MyCustomObject class 创建的默认构造函数冲突。 我假设您正在使用此方法来将 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。第二个 运行 从文件中读取然后我打印了元素的数量和我之前保存的信息:图片说明了结果