我有一个build_value对象,声明如下:
abstract class ParentItem<T> implements Built<ParentItem<T>, ParentItemBuilder<T>> {
static Serializer<ParentItem> get serializer => _$parentItemSerializer;
int get skip;
int get limit;
int get total;
BuiltList<T> get items;
ParentItem._();
factory ParentItem([updates(ParentItemBuilder<T> b)]) = _$ParentItem<T>;
}
在dart / built_value中反序列化这个的正确方法是什么?以下工作均不起作用:
// Fails with no builder for BuiltList<dynamic><Object>.
serializers.deserializeWith(ParentItem.serializer, json);
// Fails with _$ParentItemSerializer is not a subtype of Serializer<ParentItem<ConcreteType>>
serializers.deserializeWith<ParentItem<ConcreteType>>(ParentItem.serialize, json);
// Fails with no builder for ParentItem<dynamic><ConcreteType>
serializers.deserialize(json, new FullType(ParentItem, [new FullType(ConcreteType)]);
答案 0 :(得分:1)
这是对的。请注意,在某些情况下,built_value 可以为您添加构建工厂,但尚未添加。这些案件存在未解决的问题
https://github.com/google/built_value.dart/issues/124
但是对于顶级泛型,它无法知道 - 你必须自己添加它们。
答案 1 :(得分:0)
似乎built_value生成器为所有可能的具体类型创建内部使用的泛型的特定版本,如下所示:
..addBuilderFactory(
const FullType(ParentType, const [const FullType(ConcreteType)]),
() => new ParentTypeBuilder<ConcreteType>())
但对于顶级对象的所有组合,它不会这样做(因为它怎么可能)...所以你必须自己添加它们。