Как сохранить объект класса данных в общих предпочтениях с помощью Kotlin?

Как сохранить экземпляр класса данных в SharedPreferences с помощью Kotlin . Я пишу этот код, но он не работает, он каждый раз вызывает сбои при извлечении данных. Я должен сделать это, чтобы сохранить бронирование пользователей на местном уровне и получить его каждый раз от предпочтений и поставить эти значения в singleton .

Авария:

 java.lang.IllegalStateException: gson.fromJson(json, BookingResponse::class.java) must not be null. 

BookingResponse – мой класс данных

 fun saveResponse(context: Context,bookingResponse: BookingResponse) { val prefs = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) val prefsEditor = prefs.edit() val gson = Gson() val json = gson.toJson(bookingResponse) prefsEditor.putString(Constants.BOOKING, json) prefsEditor.commit() } /** * Get bookingResponse from the shared preference * * @return Saved BookingResponse */ fun getResponse(context:Context): BookingResponse { val prefs = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) val gson = Gson() val json = prefs.getString(Constants.BOOKING, "") return gson.fromJson<BookingResponse>(json, BookingResponse::class.java) } 

Solutions Collecting From Web of "Как сохранить объект класса данных в общих предпочтениях с помощью Kotlin?"

BookingResponse данных BookingResponse содержит свойства, определенные как BookingResponse .

В тот момент, когда вы вызываете prefs.getString(Constants.BOOKING, "") в первый раз, json устанавливается в пустую строку. Когда вы конвертируете эту строку в экземпляр BookingResponse , у вас не будет никаких свойств. Gson создаст этот экземпляр независимо, что приведет к свойствам с нулевым значением. Поскольку это недопустимо, вы получаете это исключение.

Чтобы исправить это, вам необходимо предоставить строку по умолчанию со всеми установленными свойствами или значениями по умолчанию, реализованными в вашем классе данных. Кроме того, вы можете обрабатывать значение по умолчанию getString() отдельно.

 json.takeUnless { it.isEmpty() } ?.let { gson.fromJson(json, BookingResponse::class.java) } ?: createEmptyBookingResponse()