Dart/Flutter 中的动态类型转换

3
我正在编写一个库,用于在Dart/Flutter中动态序列化/反序列化任何对象(类似于Python中的Pydantic)。然而,我发现实现最后一个组件——动态类型转换是不可能的。这是为了将JSON中的类型转换,例如从List到List(或类似的类型)。使用反射从对象中检索类型。
以下是期望的实现方式(但据我所知,在Dart中不可能实现)。
Map<String, Type> dynamicTypes = {"key": int };

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

有没有一些解决办法使得这个可以实现?还是说我已经走到了死胡同(因此不存在其他动态序列化/反序列化包)。

2个回答

2
进行更多的研究后发现,在Dart的当前实现中,由于运行时反射被禁用,因此这是不可能的,正如官方文档所述
关于支持此功能以及相关的dart:mirrors包,目前正在GitHub上进行讨论此处,但尽管有一些人希望实现这样的功能,但高度不可能被实现。
因此,唯一的选择是:
  • 使用代码生成库生成方法。
  • 手动序列化/反序列化方法。
  • 实现具有复杂类型(如列表和映射)的类为动态,从而启用(虽然有限的)自动序列化/反序列化。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接