gson не удалось десериализовать дату и время после изменения 24-часового формата в Android Настройки телефона - PullRequest
2 голосов
/ 25 января 2020

поэтому у меня есть User класс, подобный этому

class User() : Parcelable {

    var uid : String = ""
    var fullname : String = ""
    var email : String = ""
    var domicile : String = "Jakarta"
    var profilePicturePath : String = ""
    var createdAt : Date = Calendar.getInstance().time
    var verified : Boolean = false
    var banned : Boolean = false

}

, как вы можете видеть, createdAt в типе данных Date. после извлечения пользовательских данных с сервера, затем я сохраняю эти пользовательские данные в общем предпочтении, используя gson, например

val gson = Gson()
val sharedPref = context.getSharedPreferences(SHARED_PREF_DATA, Context.MODE_PRIVATE)

val json = gson.toJson(user)

with(sharedPref.edit()) {
     putString(USER_DATA, json)
     apply()
} 

, на этом этапе пользователь все еще использует данные в 24-часовом формате, как показано на рисунке ниже в их Android настройки телефона при сохранении пользовательских данных в общем предпочтении с помощью gson

enter image description here

, но если пользователь отключает этот 24-часовой формат, чтобы использовать 13:00 PM форматировать, тогда оно взломает sh мое приложение. это произошло в этом коде при загрузке сохраненных пользовательских данных из общего предпочтения

val gson = Gson()
val sharedPref = context.getSharedPreferences(SHARED_PREF_DATA, Context.MODE_PRIVATE)

val json = sharedPref.getString(USER_DATA, "")

if (json == null) {
   return null
} else {
   return gson.fromJson(json, User::class.java)  // <----- In This Line !!!
}

, похоже, не удалось десериализовать createdAt до даты из общего предпочтения, если пользователь изменил свой формат даты. вот ошибка

Caused by: com.google.gson.JsonSyntaxException: Jan 25, 2020 11:32:38
        at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:87)
        at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:75)
        at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:46)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
        at com.google.gson.Gson.fromJson(Gson.java:932)
        at com.google.gson.Gson.fromJson(Gson.java:897)
        at com.google.gson.Gson.fromJson(Gson.java:846)
        at com.google.gson.Gson.fromJson(Gson.java:817)

Я должен очистить кэш / данные приложения, чтобы предотвратить сбои приложения, возможно, потому что оно было восстановлено с использованием формата 13:00

что я должен сделать, чтобы решить эту Cra sh? Java или Kotlin все в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...