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会发出抱怨。我还需要反序列化它