是否可以扩展类并仍然使用DSON Generator for Dart?

时间:2018-06-08 01:32:18

标签: serialization dart linkedhashmap dartson

我使用sdk 1.24进行了dart web app,并且一直使用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 :(得分:0)

需要做两件事:

  • 使用serializable运算符
  • 扩展生成的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;
}

答案 1 :(得分:-1)

我对package:dson并不熟悉,但是使用和编写了各种序列化代码生成器,这一切都归结为知道:在输入的情况下应该创建什么类?

在大多数情况下,序列化格式不包含类信息(存储它太冗长),并且库无法确定是否需要为给定输入实例化超类或子类。我怀疑dson也是如此。

在大多数情况下,如果使用合成而不是继承,您将获得更好的性能并且可以保持面向未来。使用protobuf查看类似问题的答案。