目前,最好的选择可能是使用Smoke图书馆。
它是 Mirrors 功能的子集,但同时具有基于 Mirrors 和基于 Codegen 的实现。它是由 PolymerDart 团队编写的,因此它与我们所得到的最接近“官方”。
在开发过程中,它将使用基于Mirrors的编码/解码;但为了发布,您可以创建一个小型转换器来生成代码。
赛斯·拉德创建代码示例在这里,我稍微延长支持子对象:
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
在这个问题得到实现之前,“良好”地实现你想要的东西并不是真正可行的;但我希望它能尽快实施;因为做像 JSON 序列化这样基本的事情有点取决于它!
Alan Knight 也在开发一个序列化包,但是我发现它缺乏对将日期时间转换为字符串这样简单的事情的支持,而且对于如此基本的事情,解决方案似乎相当冗长。
目前,在我自己的项目中,我已经对 json 序列化进行了代码生成(以 toMap 和 fromMap 方法的形式),因为我们已经有了用于服务器端的类的 C# 版本。如果时间允许,我想整理这些代码并制作一个 NuGet 包(它支持嵌套对象、数组、排除属性等)。