我正在编写一个库来动态序列化/反序列化 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"];
是否有一些解决方法可以实现这一点?或者我已经陷入了死胡同(因此不存在其他动态序列化/反序列化包)。
您的问题没有具体说明
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);
}
我正在使用自制的类型适配器来缓存任何类型并将其存储在 sqflite 数据库中。 该结构的灵感来自 chatGPT-4。 您可以在此处查看完整代码:github 链接