9

I am saving my arraylist of custom model into shared preference using Gson

Storing code:

ArrayList<DownloadProgressDataModel> arrayList = getArrayListFromPref(downloadProgressDataModel);
        SharedPreferences.Editor prefsEditor = getSharedPreferences("APPLICATION_PREF", MODE_PRIVATE).edit();

        Gson gson = new Gson();
        String json = gson.toJson(arrayList);
        prefsEditor.putString("DownloadManagerList", json);
        prefsEditor.apply();
    }

Retrieving

ArrayList<DownloadProgressDataModel> arrayList;
        Gson gson = new Gson();

        SharedPreferences  mPrefs = getSharedPreferences("APPLICATION_PREF", MODE_PRIVATE);
        String json = mPrefs.getString("DownloadManagerList", "");

        if (json.isEmpty()) {
            arrayList = new ArrayList<DownloadProgressDataModel>();
        } else {
            Type uriPath = new TypeToken<ArrayList<DownloadProgressDataModel>>() {
            }.getType();
            arrayList = gson.fromJson(json, uriPath);  <------ Error line
        }

But on the error line I'm getting: can't instantiate class android.net.Uri

Model

public class DownloadProgressDataModel {
    private Uri uriPath;
    private long referenceId;

    public Uri getUriPath() {
        return uriPath;
    }

    public void setUriPath(Uri uriPath) {
        this.uriPath = uriPath;
    }

    public long getReferenceId() {
        return referenceId;
    }

    public void setReferenceId(long referenceId) {
        this.referenceId = referenceId;
    }
}
Syed Asad Abbas Zaidi
  • 1,006
  • 1
  • 17
  • 32

2 Answers2

16

Uri class constructor is private and it's an abstract class. Gson tries to create a new object for the Uri class using Reflection API(We can't create an object for abstract class). So simple solution is to change the uriPath into String instead of Uri.

 private String uriPath;
VinayagaSundar
  • 1,673
  • 17
  • 18
-1

meh, just exclude the problematic instance variable(s) from the serialization/deserialization process. Gson: How to exclude specific fields from Serialization without annotations

wooldridgetm
  • 2,500
  • 1
  • 16
  • 22