如何在序列化库(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
我使用序列化库 (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