gpt4 book ai didi

dart - Dart中抽象类型的反序列化

转载 作者:行者123 更新时间:2023-12-03 03:20:14 26 4
gpt4 key购买 nike

请考虑以下代码段,声明一个基类和两个扩展程序。

abstract class Animal {
final bool flag;

Animal(this.flag);
}

class Cat extends Animal {
final String name;

Cat(this.name, bool flag) : super(flag);

Cat.fromJson(Map<String, dynamic> json)
: name = json['name'],
super(json['flag']);
}

class Fish extends Animal {
final int memory;

Fish(this.memory, bool flag) : super(flag);

Fish.fromJson(Map<String, dynamic> json)
: memory = json['memory'],
super(json['flag']);
}
序列化和反序列化以下列表的最佳实践是什么?
List<Animal> animals = [Cat('Nancy', true), Fish(10, false)];
因此,如何序列化每个类的类型信息,以便在反序列化时构造适当的实例?
为了简单起见,省略了序列化代码,但是它将返回成员字段的映射。上面的代码仅是示例-结构或数据中没有意义。
编辑:我希望不使用任何库或代码生成器,而是使用语言的内部功能。
任何建议都表示赞赏,谢谢。

最佳答案

我必须弄清楚这一点,因此我提供了针对该问题的幼稚解决方案。但是,如果有人提供更好的方法,我将其标记为答案。
我朴素的解决方案是用包含子类名称的'type'字段修饰每个JSON结果。然后,我可以为基本类型创建一个工厂,该工厂根据该“类型”字段构造适当的实例。完整代码:

abstract class Animal {
final bool flag;

Animal(this.flag);

factory Animal.fromJson(Map<String, dynamic> json) {
switch (json['type']) {
case 'cat':
return Cat.fromJson(json);
case 'fish':
return Fish.fromJson(json);
default:
throw 'Invalid animal type';
}
}
}

class Cat extends Animal {
final String name;

Cat(this.name, bool flag) : super(flag);

Cat.fromJson(Map<String, dynamic> json)
: name = json['name'],
super(json['flag'].toString() == 'true');

Map<String, dynamic> toJson() {
return {'type': 'cat', 'name': name, 'flag': flag.toString()};
}
}

class Fish extends Animal {
final int memory;

Fish(this.memory, bool flag) : super(flag);

Fish.fromJson(Map<String, dynamic> json)
: memory = json['memory'],
super(json['flag'].toString() == 'true');

Map<String, dynamic> toJson() {
return {'type': 'fish', 'memory': memory, 'flag': flag.toString()};
}
显然,在反序列化期间,应使用以下工厂方法映射列表项:
var data = jsonDecode("[{'type':'cat','name':'Nancy','flag':'true'},{'type':'fish','memory':10,'flag':'false'}]");
List<Animal> list = data.map((e) => Animal.fromJson(e)).cast<Animal>().toList();

关于dart - Dart中抽象类型的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63801399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com