Dart/Flutter 中的动态类型转换

问题描述 投票:0回答:3

我正在编写一个库来动态序列化/反序列化 Dart/Flutter 中的任何对象(类似于 Python 的 Pydantic)。但是,我发现不可能实现最后一个组件,即动态类型转换。这是从 JSON 转换类型所必需的,例如列表到列表(或类似)。使用反射从对象中检索类型。

下面是所需的实现(尽管据我所知,这在 Dart 中是不可能的)。

Map<String, Type> dynamicTypes = {"key": int };

// Regular casting would be "1" as int
int value = "1" as dynamicTypes["key"];

是否有一些解决方法可以实现这一点?或者我已经陷入了死胡同(因此不存在其他动态序列化/反序列化包)。

flutter dart types casting
3个回答
2
投票

对这个问题进行更多研究,在 Dart 当前的实现中,这似乎是不可能的,因为运行时反射被禁用,如官方文档中here所引用。

GitHub 上关于对此功能和相关包 dart:mirrors here 的支持正在进行持续讨论,但到目前为止,尽管有人希望实现此类功能,但实现起来的可能性极小。

因此,唯一的选择是:

  • 使用代码生成库生成方法。
  • 手动序列化/反序列化方法。
  • 实现具有复杂类型的类,例如动态列表和映射,从而实现(所有限制)自动序列化/反序列化。

0
投票

您的问题没有具体说明

dynamicTypes
是如何构建的,或者它的密钥是如何派生的。所以也许有一个细节我不清楚。

但是像这样的事情呢?

class Caster<T> {
  final T Function(String) fromString;
  Caster(this.fromString);
}

void main() {
  Map<String, Caster> dynamicTypes = { "key": Caster<int>((s) => int.parse(s)) };
  int v = dynamicTypes['key']!.fromString('1');
  print(v);
}

或者,如果您的值是

dynamic
而不是字符串:

class Caster<T> {
  T cast(dynamic value) => value as T;
}

void main() {
  Map<String, Caster> dynamicTypes = { "key": Caster<int>() };
  dynamic a = 1;
  int v = dynamicTypes['key']!.cast(a);
  print(v);
}

或者更简洁地说:

void main() {
  dynamic a = 1;
  int v = a;
  print(v);
}

0
投票

我正在使用自制的类型适配器来缓存任何类型并将其存储在 sqflite 数据库中。 该结构的灵感来自 chatGPT-4。 您可以在此处查看完整代码:github 链接

© www.soinside.com 2019 - 2024. All rights reserved.