共享首选项在<integer>发布版本中保存具有双精度值的数组列表



所以我遇到了一个问题,我似乎找不到原因,所以我在这里寻求帮助。我能够找到问题的来源,但我找不到为什么会发生,这就是我所拥有的。

这是我尝试保存在共享首选项中的示例。

public class Registo implements Serializable {
    int id;
    String name;
    ArrayList<Integer> commitedViolations= new ArrayList<>();
}

我做了保存它的所有过程

public void addRegisto(Context context, Registo registo) {
        ArrayList<Registo> registos = getRegistos(context);
        if (registos == null)
            registos = new ArrayList<>();
        registos.add(registo);
        saveRegistos(context, registos);
    }

public void saveRegistos(Context context, ArrayList<Registo> favorites) {
    // used for store arrayList in json format
    SharedPreferences settings;
    SharedPreferences.Editor editor;
    settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    editor = settings.edit();
    Gson gson = new Gson();
    String jsonFavorites = gson.toJson(favorites);
    editor.putString(REGISTOS, jsonFavorites);
    editor.apply();
}

这就是神奇发生的地方,当我检索保存在设备中的对象时,使用以下值 [200, 201, 202] 保存的对象的 arrayList 现在将它们作为双精度值 [200.0, 201.0, 202.0] 返回。

我做了一个解决方法,但我想知道为什么会发生这种情况。

public ArrayList<Registo> getRegistos(Context context) {
    SharedPreferences settings;
    List<Registo> registos;
    settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    if (settings.contains(REGISTOS)) {
        String jsonFavorites = settings.getString(REGISTOS, null);
        Gson gson = new Gson();
        Registo[] registosItems = gson.fromJson(jsonFavorites, Registo[].class);
        // <WORKAROUND>
            for (Registo registosItem : registosItems) {
                for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
                    String str = String.valueOf(registosItem.getCommitedViolations().get(i));
                    double valueAsDouble = Double.parseDouble(str);
                    int valueAsInt= (int) valueAsDouble;
                    registosItem.getCommitedViolations().set(i, valueAsInt);
                }
            }
        // </WORKAROUND>

        registos = Arrays.asList(registosItems);
        registos = new ArrayList<>(registos);
    } else
        return null;
    return (ArrayList<Registo>) registos;
}

附言。最奇怪的部分是调试版本运行良好,此错误仅发生在发布版本上。

这是gson的问题,与SharedPreferences无关,因为它们不会修改您正在保存的字符串。

错误在于gson序列化和反序列化Integer。你可以在这里看到一个关于这个问题的问题。

        for (Registo registosItem : registosItems) {
            for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
                String str = String.valueOf(registosItem.getCommitedViolations().get(i));
                int valueAsInt= Integer.parseInt(str);
                registosItem.getCommitedViolations().set(i, valueAsInt);
            }
        }

这应该可以解决您关于双精度的问题,为什么不直接解析字符串?

最新更新