Android Firebase Firestore не может десериализовать абстрактный класс - PullRequest
0 голосов
/ 16 января 2019

Я перевожу свое существующее приложение для использования Firebase Firestore. У меня проблема с одной из моих моделей, содержащей список объектов, наследующих абстрактный класс:

// Model
class Project {
    ...
    ArrayList<PaintItem> paintItems;
    ...
}

abstract class PaintItem {
    ...
}

class CeilingPaintItem extends PaintItem {
    ...
}

class WindowPaintItem extends PaintItem {
    ...
}

Хранение объекта Project работает нормально, но при его извлечении:

project = documents.toObject(Project.class)

Выдает исключение при попытке создать экземпляр абстрактного класса (PaintItem). Я подозреваю, что это происходит потому, что сериализация не проверяет, какой класс PaintItem на самом деле.

Какой лучший способ преодолеть это? Под лучшим я подразумеваю:

  • Самый эффективный
  • Поддерживается в том случае, если мне нужно изменить поля данных в PaintItem и наследующих классах

1 Ответ

0 голосов
/ 16 января 2019

Во-первых, самое эффективное решение - вообще не использовать автоматическое сопоставление объектов. Это использует отражение Java, которое не очень быстро. Во время выполнения намного быстрее управлять Картами и Списками самостоятельно. Вы ничего не можете сделать, чтобы улучшить производительность сериализации на основе отражений, кроме использования меньшего количества полей.

Во-вторых, вы не можете позволить интерфейсу или абстрактному классу участвовать в сериализации отображения объектов, как вы обнаружили. Firebase SDK не имеет никакого представления ни о каких типах объектов, которые вы использовали для сериализации. Он просто смотрит на методы получения и установки каждого объекта (или открытые поля), чтобы определить, как сопоставить свойства объекта с полями и наоборот. Вы должны указать конкретный класс с помощью конструктора без аргументов, если хотите использовать автоматическое сопоставление объектов. Если PaintItem всегда будет абстрактным, то как минимум вам нужен конкретный подкласс PaintItem в Project, чтобы SDK мог десериализовать объект.

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