如何在本地存储 android 中保存 arrayList<Custom Object>?

How to save arrayList<Custom Object> in local storage android?

我有一个应用程序可以获取图像的 uri 和名称以及 ArrayList<ImageModel> 的 returns arrayList。其中图像模型包含 uriname 两个变量,每个变量包含 GetterSetter

try {
            FileOutputStream outputStreamWriter = getContext().openFileOutput("config.txt", Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(outputStreamWriter);
            oos.writeObject(arrayList);
            oos.close();
            outputStreamWriter.close();
        } catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
        }

当我尝试使用上面的方法保存 arrayList 时,它会抛出 java.io.NotSerializableException: android.net.Uri$HierarchicalUri 异常。但是,我的 ImageModel 实现了 Serializable.

 try {
            FileInputStream fis = getContext().openFileInput("config.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object object = ois.readObject();
            return object;
        } catch (Exception ex) {
            return null;
        }

因为未写入文件,所以此读取方法 return 无效。所以,我需要合适的解决方案来将 arrayList 保存到本地存储并检索它。此外,我将通过 arrayList.get() 方法加载图像 uri。所以,我想 ArrayList 是必须的。

你不能直接将对象保存到存储中,你必须将它们序列化,然后将这个序列化数据存储到存储中。您必须读取序列化数据,然后反序列化它以取回您的对象。 More on serialization

在您的代码中,oos.writeObject() 要求传递的对象必须是可序列化的,但您的 ImageModel 不是因为具有 Uri 类型的成员。

可能的解决方法:将您的 ImageModel class 修改为可序列化。并保持您的存储 read/write 逻辑不变。

ImageModel class

public class ImageModel implements Serializable {
    private String uriString;
    private String name;

    public ImageModel(Uri uri, String name) {
        this.uriString = uri.toString();
        this.name = name;
    }
    
    public Uri getUri() {
        return Uri.parse(uriString);
    }

    public String getName() {
        return name;
    }
    
    public void setUri(Uri uri) {
        this.uriString = uri.toString();
    }

    public void setName(String name) {
        this.name = name;
    }
}

还有其他序列化选项(即Json),您也可以使用它们。