您最好的选择是使用Smoke https://pub.dartlang.org/packages/smoke图书馆。
它是 Mirrors 功能的子集,但同时具有基于 Mirrors 和基于 Codegen 的实现。它是由 PolymerDart 团队编写的,因此它与我们所得到的最接近“官方”。
在开发过程中,它将使用基于Mirrors的编码/解码;但为了发布,您可以创建一个小型转换器来生成代码。
赛斯·拉德创建代码示例在这里 https://gist.github.com/sethladd/34b0d812b29c3bfd9529,我稍微延长 https://gist.github.com/DanTup/d0b486d276f49da93e74支持子对象:
abstract class Serializable {
static fromJson(Type t, Map json) {
var typeMirror = reflectType(t);
T obj = typeMirror.newInstance(new Symbol(""), const[]).reflectee;
json.forEach((k, v) {
if (v is Map) {
var d = smoke.getDeclaration(t, smoke.nameToSymbol(k));
smoke.write(obj, smoke.nameToSymbol(k), Serializable.fromJson(d.type, v));
} else {
smoke.write(obj, smoke.nameToSymbol(k), v);
}
});
return obj;
}
Map toJson() {
var options = new smoke.QueryOptions(includeProperties: false);
var res = smoke.query(runtimeType, options);
var map = {};
res.forEach((r) => map[smoke.symbolToName(r.name)] = smoke.read(this, r.name));
return map;
}
}
目前,Smoke 中不支持获取泛型类型信息(例如支持 List);不过我在这里提出了一个关于此的案例:
https://code.google.com/p/dart/issues/detail?id=20584 https://code.google.com/p/dart/issues/detail?id=20584
在这个问题得到实现之前,“良好”地实现你想要的东西并不是真正可行的;但我希望它能尽快实施;因为做像 JSON 序列化这样基本的事情有点取决于它!