Firestore десериализует неизвестный тип перечисления

#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