#android #firebase #kotlin
#Android #firebase #kotlin
Вопрос:
Допустим, у меня есть следующий объект
User {
gender: Gender = MALE
age: Int = 0
}
и я хранил это в firestore. теперь предположим, что пол является перечислением следующим образом
enum class Gender {
MALE,
FEMALE
}
если бы я сейчас сказал, что хочу расширить Gender
перечисление с OTHER
помощью и сохранить это в firestore, а более ранняя версия моего приложения хочет прочитать это из firestore, оно не знает пол OTHER
. если бы я прочитал форму colleciton и вызвал snapshot.toObject<Gender>()
это привело бы к ошибке: java.lang.RuntimeException: Could not deserialize object. Could not find enum value of User for value "OTHER" (found in field 'gender')
.
Как бы я сказал, если это произойдет, что я бы выбрал, например MALE
, по умолчанию, и исключение не возникло бы. поскольку я не могу переопределить valueOf()
функцию перечисления, которая используется toObject()
функцией, я совершенно не знаю, как это сделать. есть предложения?
Комментарии:
1. возможно, вам не удастся избежать исключения, но, может быть, вы можете его использовать? разве вы не можете добавить try catch и, если возникает исключение, по умолчанию использовать ваше значение?
2. @a_local_nobody Я тоже думал об этом, но я предполагаю, что если сериализация вызовет исключение, и у меня не будет объектов, где я мог бы вручную установить тип перечисления по умолчанию.
3. Не могли бы вы показать нам, как вы сохраняете значение «MALE» в Firestore? Пожалуйста, ответьте с помощью @AlexMamo
4. Для обратной совместимости, которую вы, вероятно, не сможете, вам придется создать новое поле, с которым новые версии вашего приложения будут знать, как работать. Я бы предложил использовать строку и самостоятельно преобразовать в enum.
5. Вы можете следить за этой проблемой на их GitHub: github.com/firebase/firebase-android-sdk/issues/1418