У меня есть архив, сохраненный в общих настройках пользовательских объектов (Book), и теперь, когда я обновил приложение (добавил новое свойство с именем Progress, которое является int), кажется, что gson пытается установить один из них. длинных в эту переменную int.
Это происходит только для избранных пользователей, которые загружают приложение через магазин, а я не смог его воспроизвести. Я вчера опубликовал что-то похожее, но без достаточной информации, и понял, что написал слишком рано.
Примечание. At myrr.auto1.myreadingrecord1.sharedFunctions.loadArrayList (sharedFunctions.java:40) является
bookList = gson.fromJson (json, type);
линия
static ArrayList<Book> loadArrayList(Context context) {
ArrayList<Book> bookList;
SharedPreferences mPrefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = mPrefs.getString("finishedBooks", "");
if (json.isEmpty()) {
bookList = new ArrayList<>();
} else {
Type type = new TypeToken<ArrayList<Book>>() {
}.getType();
bookList = gson.fromJson(json, type);
}
return bookList;
}
Fatal Exception: com.google.a.r: java.lang.NumberFormatException: Expected an int but was 1538513480946 at line 1 column 1891 path $[0].i
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:227)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:217)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.Gson.fromJson(Gson.java:888)
at com.google.gson.Gson.fromJson(Gson.java:853)
at com.google.gson.Gson.fromJson(Gson.java:802)
at myrr.auto1.myreadingrecord1.sharedFunctions.loadArrayList(sharedFunctions.java:40)
Вот так выглядит строка json в старых версиях:
{"author":"Kerry Cohen Hoffmann",
"categories":"Juvenile Fiction",
"description":"Feeling neglected by her divorced parents and distant older sister, fourteen-year-old Jessica discovers how easily she is able to attract the attention of men and boys, without realizing the risks of her behavior.",
"endTime":1546742469961,
"imageURL":"http://books.google.com/books/content?id\u003d7wLjQH5_HjEC\u0026printsec\u003dfrontcover\u0026img\u003d1\u0026zoom\u003d5\u0026edge\u003dcurl\u0026source\u003dgbs_api",
"language":"en",
"moreInfoLink":"http://books.google.com/books?id\u003d7wLjQH5_HjEC\u0026dq\u003deasy\u0026hl\u003d\u0026as_pt\u003dBOOKS\u0026source\u003dgbs_api",
"pages":"176",
"startTime":1546553627662,
"title":"Easy"}
И это свойства класса Book, сеттеры и геттеры довольно нормальные, поэтому я их не включал.
public class Book implements Serializable{
private String author;
private String title;
private String pages;
private String imageURL;
private String description;
private String categories;
private String moreInfoLink;
private String language;
private int progress = 0;
private long startTime = 0L;
private long endTime = 0L;
public Book (String author, String title, String pages, String description, String imageURL, String categories, String moreInfoLink, String language) {
this.author = author;
this.title = title;
this.pages = pages;
this.description = description;
this.imageURL = imageURL;
this.categories = categories;
this.moreInfoLink = moreInfoLink;
this.language = language;
}
Таким образом, для некоторых выбранных пользователей fromJson пытается вставить значение starttime или endtime в новое свойство progress. Как я могу предотвратить это?
Он должен просто создать новый ArrayList of Book, но на самом деле он просто падает.
ДОБАВЛЕНИЕ:
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;}
theCRBook.setStartTime(Calendar.getInstance().getTimeInMillis());