我使用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对象转换为地图的能力?
提前感谢您的任何指导!
答案 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查看类似问题的答案。