如何在序列化库(dart2js)上使用@MirrorUsed 注释?

How to use the @MirrorUsed annotation on Serialization lib (dart2js)?

我使用序列化库 (https://pub.dartlang.org/packages/serialization) 来持久化和恢复复杂对象。

一个转换复杂对象的优秀库(也转换为 JSON!)。恭喜 Google 人!

然而,需要在js(dart2js)中转换dart,我没有成功使用MirrorUsed。我想减少代码量!

当我像下面这样使用@MirrorUsed 时,序列化不起作用。

main_app.dart

@MirrorsUsed(targets: 'serialization.serialization_mirrors.Serialization', override: '*')
import 'dart:mirrors';    
import 'package:serialization/serialization_mirrors.dart';
// [..other imports..]

@PolymerRegister('main-app')
class MainApp extends PolymerElement {
  var serializationProdutos;
  @property
  List produtos = new List();

  void ready() {

    Produto p = new Produto()..descricao = "SUPER TESTE"..unidade = "Unitário";
    Produto p2 = new Produto()..descricao = "SUPER TESTE 2"
    ..ehComposto = true


    Map m = new Map()
    ..putIfAbsent("expandir", () => true)..putIfAbsent(
      "produto", () => p);
    Map mm = new Map()
    ..putIfAbsent("expandir", () => true)..putIfAbsent(
      "produto", () => p2);

    (mm['produto'] as Produto).componentes.add(new ProdutoComponente()..produtoComponente = p);
    add('produtos', m);
    add('produtos', mm);
  }

  @reflectable
  salvarDados(Event e, [_]) {
    serializationProdutos = new Serialization();
    serializationProdutos.addRuleFor(Produto);
    serializationProdutos.addRuleFor(ProdutoComponente);
    var jsonProdutos = JSON.encode(serializationProdutos.write(produtos));  
    window.localStorage['precoMi_produtos'] = jsonProdutos;
  }

  @reflectable
  carregarDados(Event e, [_]) {
     var jsonProdutos = window.localStorage['precoMi_produtos'];
    if (jsonProdutos != null) {
      try {
           serializationProdutos = new Serialization();
           serializationProdutos.addRuleFor(Produto);
           serializationProdutos.addRuleFor(ProdutoComponente);
           List pro = serializationProdutos.read(JSON.decode(jsonProdutos));
           addAll('produtos', pro);
      } catch (e) {
        window.console.log(
            'Error local storage. ${e}');
      }
  }

我使用@MirrorUsed 是否正确?

如果您使用的是 Polymer,那么它使用的是 Reflectable 包,它比 MirrorsUsed 更容易优化,我什至不确定两者是否能很好地协同工作。确实,需要更新序列化包才能启用此功能。

作为短期解决方法,我建议使用非镜像序列化规则。您可以手动编写这些,这在维护方面对您来说工作量更大,但是如果 类 的数量不是太大,它可能是可以接受的,并且它应该产生相当小的代码而不需要您额外的努力部分。或者,如果您的 类 相对简单(没有复杂的构造函数、排序依赖项),您可以使用序列化转换器来生成它们。不幸的是,有一个错误,dartdocs 没有显示库评论,所以你必须查看评论,例如https://github.com/google/serialization.dart/blob/master/lib/transformer.dart and https://github.com/google/serialization.dart/blob/master/lib/serialization.dart