2015-05-13 5 views
1

Я хотел бы сериализации этого непреложного классаDart сериализация неизменных объектов

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

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

Но я не могу, поскольку это не просто класс. С веб-сайта https://www.dartlang.org/articles/serialization/

Simple: Все объекты должны быть Сериализованные передачи данных объектов (DTO) с конструктором по умолчанию.

Поэтому я должен добавить конструктор по умолчанию - это означает, что я должен удалить последние ключевые слова, а мой класс больше не является неизменным.

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

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

Есть ли какой-либо путь вокруг этого?

+0

Попробуйте пакет dartson, который предлагает несколько вариантов настройки. Если вы столкнулись с проблемой или проблемой, обновите этот вопрос с помощью кода, который вы попробовали, и любых ошибок, которые вы могли бы получить. Благодаря! –

+0

Я думаю, что конструктор по умолчанию нужен только для десериализации (никогда не использовал пакет для (де) сериализации). Сериализация не нужна. –

+0

Api жалуется, если у вас нет стандартного конструктора по умолчанию при сериализации объекта. Мне также нужно десериализовать его – richard

ответ

1

Я думаю, что конструктор по умолчанию необходим только для десериализации (никогда не использовался пакет для (де) сериализации). Сериализация не нужна.

Конструктор по умолчанию является избыточным, поскольку, если пакет десериализации требует конструктора по умолчанию, он, очевидно, пытается создать экземпляр, используя конструктор по умолчанию, чтобы впоследствии установить значения полей, которые не могут работать с конечными полями.

Я не знаю, поддерживает ли пакет сериализации специальный способ 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(); 
    } 
} 
0

Один из вариантов заключается в том, чтобы прочитать далее в статье и использовать пакет сериализации, который обрабатывает такие случаи.

1

https://github.com/google/built_value.dart может делать то, что вы хотите - это специально для создания неизменяемых классов и их сериализации.

Обратите внимание, что для этого требуется несколько другая форма для класса. Это значит, что build_value генерирует реализацию для вас и сериализаторы.

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._(); 
} 

Сгенерированный реализация является неизменяемым (использует конечный), а также обеспечивает оператор ==, хэш-код и ToString.

Более подробный пример: https://github.com/google/built_value.dart/blob/master/example/lib/example.dart

Смежные вопросы