如何使用序列化包

时间:2014-01-21 23:47:38

标签: serialization dart dart-mirrors

我想将我的班级转换为Map所以我正在使用Serialization套餐。从示例中看起来很简单:

var address = new Address();
 address.street = 'N 34th';
 address.city = 'Seattle';
 var serialization = new Serialization()
     ..addRuleFor(Address);
 Map output = serialization.write(address);

我希望看到类似{'street' : 'N 34th', 'city' : 'Seattle'}的输出,但它只输出一些我不知道的东西

{"roots":[{"__Ref":true,"rule":3,"object":0}],"data":[[],[],[],[["Seattle","N 34th"]]],"rules":"{\"roots\":[{\"__Ref\":true,\"rule\":1,\"object\":0}],\"data\":[[],[[{\"__Ref\":true,\"rule\":4,\"object\":0},{\"__Ref\":true,\"rule\":3,\"object\":0},{\"__Ref\":true,\"rule\":5,\"object\":0},{\"__Ref\":true,\"rule\":6,\"object\":0}]],[[],[],[\"city\",\"street\"]],[[]],[[]],[[]],[[{\"__Ref\":true,\"rule\":2,\"object\":0},{\"__Ref\":true,\"rule\":2,\"object\":1},\"\",{\"__Ref\":true,\"rule\":2,\"object\":2},{\"__Ref\":true,\"rule\":7,\"object\":0}]],[\"Address\"]],\"rules\":null}"}

3 个答案:

答案 0 :(得分:3)

序列化不应该创建人类可读的输出。也许JSON输出更符合您的要求:

import dart:convert;

{
var address = new Address();
  ..address.street = 'N 34th';
  ..address.city = 'Seattle';

var encoded = JSON.encode(address, mirrorJson);
}

Map mirrorJson(o) { 
  Map map = new Map();
  InstanceMirror im = reflect(o);
  ClassMirror cm = im.type;
  var decls = cm.declarations.values.where((dm) => dm is VariableMirror);
  decls.forEach((dm) {
    var key = MirrorSystem.getName(dm.simpleName);
    var val = im.getField(dm.simpleName).reflectee;
    map[key] = val;
  });

  return map;
}   

答案 1 :(得分:1)

new Address()创建一个完整的原型对象,这就是你所看到的。话虽这么说,他们本可以做些什么来避免其中的一部分,但如果你想恢复对象,那就是必要的。

要查看对象的完整内容,请以这种方式使用for()指令:

for(obj in idx) alert(obj[idx]);

您会看到以这种方式获取大量数据。没有new Address(),它可能不会那么糟糕。

答案 2 :(得分:0)

序列化对你没有帮助......

您可以尝试JsonObject库,也可以通过this深入解释如何使用镜像执行您要执行的操作。