Можно ли расширить классы и при этом использовать DSON Generator для Dart? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть веб-приложение dart, использующее SDK 1.24, и я использую dson: 0.11.0 для генерации сериализуемых классов / моделей для моих объектов, которые сохраняются в базе данных firestore.

Мне нравится, как dsonсгенерированные классы дают мне возможность создать объект dart из карты или сериализовать объект dart в карту для сохранения в firebase.

При этом генератору dson требуется, чтобы мой класс модели расширил сериализуемый рефератсгенерированный класс.

Мое приложение начинает расти довольно большим, и я борюсь с невозможностью использования наследования и разработки иерархии классов.

Если я не пропустил какую-то концепцию, которую сам по себе не смог бы раскрыть, я не могу понять, как использовать наследование классов с генератором dson.

Например, вотдействительно простой пример того, что я пытаюсь сделать.

class EmploymentIncome extends Object {        
    String employerName;
    Address employerAddress;
    DateTime hireDate;
}


class SalaryIncome extends EmploymentIncome {
    double annualSalary;
}


class HourlyIncome extends EmploymentIncome {
    double hourlyRate;
    double hoursPerWeek;
 }


class hourlyPaystub extends HourlyIncome {
    double yearToDateHourlyEarnings;
    double hoursWorked;
    DateTime payDate;
    DateTime periodEndingDate;
}


class salaryPaystub extends SalaryIncome {
    double yearToDateSalaryEarnings;
    DateTime payDate;
    DateTime periodEndingDate;
}

Проблема в том, что генератор dson требует от моих моделей расширения сгенерированного абстрактного класса, см. ниже:

@serializable
class EmploymentIncome extends _$EmploymentIncomeSerializable {
    class EmploymentIncome extends Object {
    String employerName;
    Address employerAddress;
    DateTime hireDate;
}

проблема, очевидно, в том, что теперь я не могу расширить EmploymentIncome другим сериализуемым классом dson.

Мне не хватает фундаментальной концепции или техники, которая позволила бы мне расширить эти классы, сохраняя при этом возможность конвертировать объекты dart в ис карт?

Заранее спасибо за любые указания!

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Необходимо сделать две вещи:

  • расширить сгенерированный * класс 1004 * с помощью оператора with
  • добавить комментарий, чтобы игнорировать ошибку анализа

Например, в вашем случае вы можете сделать:

@serializable
class EmploymentIncome extends _$EmploymentIncomeSerializable {
    String employerName;
    Address employerAddress;
    DateTime hireDate;
}

@serializable
// ignore: mixin_inherits_from_not_object
class SalaryIncome extends EmploymentIncome with _$SalaryIncomeSerializable {
    double annualSalary;
}

@serializable
// ignore: mixin_inherits_from_not_object
class HourlyIncome extends EmploymentIncome with _$HourlyIncomeSerializable {
    double hourlyRate;
    double hoursPerWeek;
 }

@serializable
// ignore: mixin_inherits_from_not_object
class HourlyPaystub extends HourlyIncome with _$HourlyPaySerializable {
    double yearToDateHourlyEarnings;
    double hoursWorked;
    DateTime payDate;
    DateTime periodEndingDate;
}

@serializable
// ignore: mixin_inherits_from_not_object
class SalaryPaystub extends SalaryIncome with _$SalaryPayStubSerializable {
    double yearToDateSalaryEarnings;
    DateTime payDate;
    DateTime periodEndingDate;
}
0 голосов
/ 08 июня 2018

Я не очень знаком с package:dson, но, использовав и написав различные генераторы кода сериализации, все сводится к знанию: какой класс должен быть создан при вводе?

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

В большинстве случаев у вас будет лучшая производительность, и вы можете остаться в будущем, если будете использовать композицию вместо наследования.Проверьте ответ на подобные вопросы с protobuf .

...