【问题标题】:Is it possible to extend classes and still use DSON Generator for Dart?是否可以扩展类并仍然使用 DSON Generator for Dart?
【发布时间】:2018-06-08 01:32:17
【问题描述】:

我有一个使用 sdk 1.24 的 dart web 应用程序,并且一直在使用 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;
}

显然,现在的问题是,我无法使用另一个可序列化的 dson 类来扩展就业收入。

我是否缺少一个基本概念或技术,可以让我扩展这些类,同时仍保持将飞镖对象与地图转换的能力?

提前感谢您的任何指导!

【问题讨论】:

    标签: serialization dart linkedhashmap dartson


    【解决方案1】:

    需要做两件事:

    • 使用with 运算符扩展生成的serializable
    • 添加注释以忽略分析错误

    例如,您可以这样做:

    @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;
    }
    

    【讨论】:

    • 非常感谢,这正是我想要的!似乎文档也已更新以解决此问题,否则当我最初查看文档时我只是不明白这一点。再次感谢您的指导,这正是我一直在寻找的……生活变得轻松多了(减去我现在需要/开始重写我所有的课程的事实)!
    • 实际上,我说得太早了......它在编辑器中工作,但当我尝试调试时得到以下信息:'用作 mixin 的类必须将 Object 作为超类。抽象类 _$SalaryIncomeCalcSerializable 扩展 SerializableMap { ^^^^^^^^`
    • 我用最新版本的 dart-sdk 测试了它,它可以正常工作
    【解决方案2】:

    我对@9​​87654322@ 不是很熟悉,但是在使用和编写过各种序列化代码生成器之后,这一切都归结为知道:在给定输入的情况下应该创建什么类?

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2018-12-04
      相关资源
      最近更新 更多