我想序列化这个不可变的类

class CatalogueItem {
  final Uri source;
  final DateTime analyis;
  final Period fromTo;

  CatalogueItem.create(this.source, this.analyis, this.fromTo);
}

但我不能,因为这不是一个简单的类(class)。从网站https://www.dartlang.org/articles/serialization/



所以我必须添加一个默认的构造函数-这意味着我必须删除final关键字,并且我的类不再是不变的。
class CatalogueItem {
  Uri source;
  DateTime analyis;
  Period fromTo;

  CatalogueItem.create(this.source, this.analyis, this.fromTo);
  CatalogueItem(){}
}

有没有办法解决这个问题?

最佳答案

我认为默认构造函数仅对于反序列化是必需的(从来不使用用于(反)序列化的包)。序列化不需要它。

默认构造函数是多余的,因为如果反序列化程序包需要默认构造函数,则它显然会尝试使用默认构造函数创建实例,然后再设置字段值,而该值不适用于最终字段。

我不知道序列化程序包是否支持自定义toJson()方法/ fromJson()构造函数,但我认为这是最简单的方法。

class CatalogueItem {
  final Uri source;
  final DateTime analysis;
  final Period fromTo;

  CatalogueItem.create(this.source, this.analysis, this.fromTo);
  factory CatalogueItem.fromJson(Map json) {
    return new CatalogueItem.create(
        json['source']   == null ? null : Uri.parse(json['source']),
        json['analysis'] == null ? null : DateTime.parse(json['analysis'])),
        json['fromTo']   == null ? null : new Period.fromJson(json['fromTo']));
  }

  Map toJson() {
    return {
      'source':   source == null ? null : '$source',
      'analysis': analysis == null ? null : '$analysis',
      'fromTo':   fromTo == null ? null : fromTo.toJson();
  }
}

关于serialization - Dart序列化不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30204276/

10-10 17:49