Dart 中 JSON 的序列化和反序列化状态

2023-12-02

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

  1. 我想知道 Dart 中 JSON 序列化/反序列化的当前状态?
  2. 未来我们应该期待什么?
  3. 这最终会得到语言本身的支持吗?
  4. 目前的最佳实践是什么?

我还希望任何读到这篇文章的人都可以发布任何新信息,即使该帖子已经过时了。


目前,最好的选择可能是使用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 包(它支持嵌套对象、数组、排除属性等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart 中 JSON 的序列化和反序列化状态 的相关文章

随机推荐

  • OpenCV 匹配模板得分不佳

    我正在尝试使用 OpenCV 进行一些图像匹配 并使用 cvMatchTemplate 函数 我拍摄了一张样本图像 然后将其一部分剪下来作为模板 然后尝试匹配它 当我这样做时 cvMatchTemplate 函数正确找到子图像并给它最好的分
  • 无法跨库项目使用 .aidl 文件吗?

    本着重用代码的精神 我正在尝试创建一些库项目 但是 我似乎在定义跨库的 aidl 文件时遇到了问题 问题是这样的 在库 A 中 我有 Foo java 和 Foo aidl Foo java 是 Parcelable 所以 aidl 声明是
  • 在 Windows XP 中安装 Xcode

    我想知道我是否可以在 Windows XP 上安装 Xcode 如果可能 还请提供文档链接 非常感谢您提前提供的帮助 这当然是可能的 有两条路线 在第二个分区 磁盘上安装 OSx86 又名 iATKOS Kalyway 并进行双引导 在 V
  • Python urllib2 进度挂钩

    我正在尝试使用 urllib2 http 客户端在 python 中创建下载进度条 我查看了 API 以及谷歌 似乎 urllib2 不允许您注册进度挂钩 然而 较旧的已弃用的 urllib 确实具有此功能 有谁知道如何使用 urllib2
  • Python 3,从 gzip 文件读取/写入压缩的 json 对象

    对于Python3 我遵循 Martijn Pieters 的代码有了这个 import gzip import json writing with gzip GzipFile jsonfilename w as fout for i in
  • 如何使用正则表达式在字符串中查找美国邮政编码?

    填写代码以检查传递的文本是否包含可能的美国邮政编码 格式如下 正好 5 位数字 有时 但并非总是 后跟带有 4 位数字的破折号 邮政编码前面至少需要一个空格 并且不能位于文本的开头 无法产生所需的输出 import re def check
  • CUDA cudaMalloc

    我已经开始编写一个新的 CUDA 应用程序 然而 我一路上遇到了一个有趣的弯路 对变量 x 调用第一个 cudaMalloc 第一次失败 但是 当我第二次调用它时 它返回 cudaSuccess 最近升级到CUDA 4 0 SDK 这是一个
  • 使用 Amazon-Lex 进行评分/意图置信度

    我尝试使用 amazon lex PostText 获取评分值或意图置信度值 但 json 文件中根本没有响应元素 https docs aws amazon com de de lex latest dg API runtime Post
  • IE 在使用 NTLM 身份验证时随机发送空 POST 正文(使用 Angular 到 Spring)

    我们发现 IE 11 中看似随机的调用缺少 POST 经过进一步检查 来自浏览器的请求包含 NTLM 协商令牌 我们有时也会在 GET 上看到此令牌 但它们不受主体问题的影响 因为它们没有主体问题 Chrome和FF没有这个问题 进一步的调
  • 选择包含 R 中每日最大值的行

    因此 我想对数据框进行子集化以选择具有每日最大值的行 Site Year Day Time Cover Size TempChange ST1 2011 97 0 0 Closed small 0 97 ST1 2011 97 0 5 Cl
  • TFS 2013 获取所有 TFS 组,包括 Windows 组

    我正在做这个TFS 2013 以获得所有TFS组的项目级别许可 但我无法获取 Windows 组 我使用以下代码列出组 var applicationGroups identityManagementService ListApplicat
  • jvisualvm:卡在“正在加载堆转储”屏幕上

    我使用以下命令使用 hprof 创建了一个堆转储文件 java agentlib hprof cp jars trove jar bin com mysite MyApp 这样就成功创建了大约 5MB 的文件 java hprof txt
  • 以声明方式描述自定义控件属性时缺少智能感知

    因此 我已经在这个项目上工作了几天 但一直无法解决为用户控件 ascx 请注意 的自定义内部属性获取智能感知支持的问题 我已经多次看到这个问题的解决方案 使用服务器控件 cs 请注意 在此写出article很好 使用 ascx 控件时 除了
  • 如何消除带括号的表达式中的子选择的歧义?

    我有以下表达式符号 expr OpenParen expr Comma expr Comma CloseParen parenExpr OpenParen simpleSelect CloseParen subSelectExpr 不幸的是
  • 无法使用 TestFlight 安装 xCode 4.3 beta 应用程序

    我刚刚升级到 xCode 4 3 并用它生成了一个 iPad 应用程序的新版本 大约 50 名 Beta 测试人员已经使用了几个月 我像往常一样通过 TestFlight 分发了测试版应用程序 大多数测试人员升级没有问题 但一些测试人员在尝
  • 如何附加和分离 Docker 的进程?

    I can attach to a docker process but Ctrl C doesn t work to detach from it exit basically halts the process 建议的工作流程是什么 让
  • WebSphere MQ 连接调整

    我有一个应用程序 它使用 MDB 激活规范和队列连接工厂从 WMQ 获取 放置消息 该应用程序预计最大负载为 80 tps Websphere Application Server 和 WMQ 都是集群式的 每个应用程序服务器都连接到单独的
  • TF 对象检测 API - 并非所有类都被检测到且行为异常

    Setup ubuntu 16 04 LTS 4 个 vCPU 30GB 内存 nvidia K80 GPU 带 12GB 内存 CUDNN 8 0 x64 TF版本1 3 目标 使用TF对象检测API检测人脸 人物 手枪 步枪 autom
  • 在没有背景附件的情况下将背景渐变扩展到整个身体:已修复

    我想要一个背景渐变 例如 background linear gradient to bottom rgba 0 0 0 0 3 rgba 2 126 174 0 9 在我的文档正文上 它延伸到正文的整个高度 并与正文一起滚动 Using
  • Dart 中 JSON 的序列化和反序列化状态

    我在 C 上的序列化方面有很好的经验 在搜索和测试了一些 Dart 库之后 我觉得总体上没有一个真正令人满意的答案 我想知道 Dart 中 JSON 序列化 反序列化的当前状态 未来我们应该期待什么 这最终会得到语言本身的支持吗 目前的最佳