在Dart中序列化和反序列化JSON的状态 [英] State of Serialization and Deserialization of JSON in Dart

查看:172
本文介绍了在Dart中序列化和反序列化JSON的状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#上有一个很好的序列化经验,在搜索和测试一些Dart库后,我觉得总体上没有一个令人满意的答案。

I've had a good experience with serialization on C#, and after searching and testing some Dart libraries I feel there isn't a really satisfactory answer in general.


  1. Id想知道Dart中JSON序列化/反序列化的当前状态吗?

  2. 我们将来会有什么期望?

  3. 这种语言本身最终会支持吗?

  4. 目前最好的做法是什么?

  1. Id like to know the current state of Serialization/Deserialization of JSON in Dart?
  2. What should we expect in the future?
  3. Will this be eventually supported by the language itself?
  4. What are currently the best practices?

推荐答案

现在,最好的选择是使用 Smoke 图书馆。

For now, the best option is probably to use the Smoke library.

这是镜像功能,但具有基于镜像和基于Codegen的实现。它由PolymerDart团队编写,因此它接近官方,我们将获得。

It's a subset of the Mirrors functionality but has both a Mirrors-based and a Codegen-based implementation. It's written by the PolymerDart team, so it's as close to "Official" as we're going to get.

在开发时,它将使用基于镜像的编码/解码;

While developing, it'll use the Mirrors-based encoding/decoding; but for publishing you can create a small transformer that will generate code.

Seth Ladd建立了此处的代码示例,我稍微扩展支持子对象:

Seth Ladd created a code sample here, which I extended slightly to support child-objects:

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;
  }
}

目前,不支持获取通用类型信息(例如:支持List)在Smoke中;但我在这里提出了一个案例:

Currently, there is no support to get generic type information (eg. to support List) in Smoke; however I've raised a case about this here:

https://code.google.com/p/dart/issues/detail?id=20584

直到这个问题实现了,一个好的实现你想要的是不是真的可行;但我希望它会很快实施;因为做一些像JSON序列化这样基本的东西就取决于它!

Until this issue is implemented, a "good" implementation of what you want is not really feasible; but I'm hopeful it'll be implemented soon; because doing something as basic as JSON serialisation kinda hinges on it!

Alan Knight也在编写一个Serialization包,但是我发现它缺乏对简单的支持将数据时间转换为字符串,并且解决方案对于这样基本的东西显得相当冗长。

Alan Knight is also working on a Serialisation package, however I found it to lack support for things as simple as converting datetimes to strings, and the solution seemed rather verbose for something so basic.

现在,在我自己的项目中,我已经使用代码创建我们的json序列化toMap和fromMap方法的形式),因为我们已经有了服务器端的类的C#版本。如果时间允许,我想整理这些代码,并制作一个NuGet包(它支持嵌套对象,数组,排除属性等)。

For now, in my own project, I've gone with codegenning our json serialisation (in the form of toMap and fromMap methods) since we would already have C# versions of our classes for the server side. If time allows, I'd like to tidy those code up and make a NuGet package (it supports nested objects, arrays, excluding properties, etc.).

这篇关于在Dart中序列化和反序列化JSON的状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆