Serialization Dart序列化不可变对象

Serialization Dart序列化不可变对象,serialization,dart,Serialization,Dart,我想序列化这个不可变的类 class CatalogueItem { final Uri source; final DateTime analyis; final Period fromTo; CatalogueItem.create(this.source, this.analyis, this.fromTo); } 但我不能,因为它不是一个简单的类。从网站 简单:所有要序列化的对象都是数据传输对象 (DTO)具有默认构造函数 所以我必须添加一个默认构造函数——这意味着我

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

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

  CatalogueItem.create(this.source, this.analyis, this.fromTo);
}
但我不能,因为它不是一个简单的类。从网站

简单:所有要序列化的对象都是数据传输对象 (DTO)具有默认构造函数

所以我必须添加一个默认构造函数——这意味着我必须删除最后的关键字,我的类不再是不变的

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

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

有什么办法解决这个问题吗?

我认为默认构造函数只在反序列化时才有必要(从未使用包进行(反)序列化)。序列化不应该需要它

默认构造函数是多余的,因为如果反序列化包需要一个默认构造函数,它显然会尝试使用默认构造函数创建一个实例,以在以后设置字段值,这不能用于最终字段

我不知道序列化包是否支持自定义的
toJson()
method/
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();
  }
}

一种选择是进一步阅读本文并使用序列化软件包,该软件包可以处理此类情况。

可以做您想做的事情——它专门用于创建不可变类并序列化它们

请注意,这要求类使用稍微不同的形式。这是为了允许build_值为您和序列化程序生成一个实现

abstract class CatalogueItem
    implements Built<CatalogueItem, CatalogueItemBuilder> {
  static Serializer<CatalogueItem> get serializer
      => _$catalogueItemSerializer;

  Uri get source;
  DateTime get analyis;
  Period get fromTo;

  factory CatalogueItem([updates(CatalogueItemBuilder b)]) =
      _$CatalogueItem;
  CatalogueItem._();
}
抽象类目录项
制造工具{
静态序列化程序获取序列化程序
=>\u$CatalogeItemSerializer;
Uri获取源代码;
日期时间得到分析;
周期从到;
工厂目录项([更新(目录项生成器b)])=
_$catalogelitem;
目录项;
}
生成的实现是不可变的(使用final),并且还提供运算符==、hashCode和toString


更详细的示例:

试试dartson软件包,它提供了一些定制选项。如果您遇到错误或问题,请使用您尝试的代码和可能遇到的任何错误更新此问题。谢谢我认为默认构造函数只在反序列化(从未使用包进行(反)序列化)时才有必要。序列化不需要它。如果在序列化对象时没有公共默认构造函数,api会发出抱怨。我还需要反序列化它