Как правильно десериализовать общий уровень верхнего уровня с помощью built_value - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть объект built_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)]);

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Это правильно. Обратите внимание, что в некоторых случаях build_value может добавить фабрики для вас, но пока нет. Есть открытый вопрос для тех случаев

https://github.com/google/built_value.dart/issues/124

но для дженериков высшего уровня это невозможно узнать - вам придется добавить их самостоятельно.

0 голосов
/ 27 апреля 2018

Похоже, что генератор built_value создает конкретные версии используемых для всех типов обобщений для всех возможных конкретных типов, например:

..addBuilderFactory(
  const FullType(ParentType, const [const FullType(ConcreteType)]),
  () => new ParentTypeBuilder<ConcreteType>())

Но он этого не делает (потому что как мог) для всех комбинаций объекта верхнего уровня ... поэтому вы должны добавить их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...