是否可以扩展 类 并仍然使用 DSON Generator for Dart?
Is it possible to extend classes and still use DSON Generator for Dart?
我有使用 sdk 1.24 的 dart web 应用程序,并且一直在使用 dson: 0.11.0 为我的对象生成可序列化 classes/models,这些对象将保存到 firestore 数据库中。
我喜欢 dson 生成的方式 classes 让我能够从地图创建 dart 对象,或者将 dart 对象序列化到地图以保存在 firebase 中。
话虽如此,dson 生成器需要我的模型 class 来扩展生成的可序列化摘要 class。
我的应用程序开始变得相当大,我正在为无法使用继承和开发 class 层次结构而苦苦挣扎。
除非我遗漏了一些我自己似乎无法破解的概念,否则我无法弄清楚如何将 class 继承与 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 生成器需要我的模型扩展生成的摘要 class,见下文:
@serializable
class EmploymentIncome extends _$EmploymentIncomeSerializable {
class EmploymentIncome extends Object {
String employerName;
Address employerAddress;
DateTime hireDate;
}
显然,现在的问题是,我无法使用另一个可序列化的 dson 扩展 EmploymentIncome class。
我是否缺少一个基本概念或技术,可以让我扩展这些 classes,同时仍然保持将 dart 对象转换为地图和从地图转换的能力?
提前感谢您的指导!
我不是很熟悉 package:dson
,但是使用和编写了各种序列化代码生成器,归结为知道:给定输入应该创建什么 class?
在大多数情况下,序列化格式不包含 class 信息(存储它太冗长),库无法真正决定是 superclass 还是 sub class 需要为给定输入实例化。我怀疑 dson
也是这种情况。
在大多数情况下,如果您使用组合而不是继承,您将获得更好的性能并且可以保持面向未来。查看与 .
类似问题的答案
需要做两件事:
- 使用
with
运算符 扩展生成的 serializable
class
- 添加注释以忽略分析错误
例如在你的情况下你可以这样做:
@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;
}
我有使用 sdk 1.24 的 dart web 应用程序,并且一直在使用 dson: 0.11.0 为我的对象生成可序列化 classes/models,这些对象将保存到 firestore 数据库中。
我喜欢 dson 生成的方式 classes 让我能够从地图创建 dart 对象,或者将 dart 对象序列化到地图以保存在 firebase 中。
话虽如此,dson 生成器需要我的模型 class 来扩展生成的可序列化摘要 class。
我的应用程序开始变得相当大,我正在为无法使用继承和开发 class 层次结构而苦苦挣扎。
除非我遗漏了一些我自己似乎无法破解的概念,否则我无法弄清楚如何将 class 继承与 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 生成器需要我的模型扩展生成的摘要 class,见下文:
@serializable
class EmploymentIncome extends _$EmploymentIncomeSerializable {
class EmploymentIncome extends Object {
String employerName;
Address employerAddress;
DateTime hireDate;
}
显然,现在的问题是,我无法使用另一个可序列化的 dson 扩展 EmploymentIncome class。
我是否缺少一个基本概念或技术,可以让我扩展这些 classes,同时仍然保持将 dart 对象转换为地图和从地图转换的能力?
提前感谢您的指导!
我不是很熟悉 package:dson
,但是使用和编写了各种序列化代码生成器,归结为知道:给定输入应该创建什么 class?
在大多数情况下,序列化格式不包含 class 信息(存储它太冗长),库无法真正决定是 superclass 还是 sub class 需要为给定输入实例化。我怀疑 dson
也是这种情况。
在大多数情况下,如果您使用组合而不是继承,您将获得更好的性能并且可以保持面向未来。查看与
需要做两件事:
- 使用
with
运算符 扩展生成的 - 添加注释以忽略分析错误
serializable
class
例如在你的情况下你可以这样做:
@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;
}