如何解决Dart中抽象类型的反序列化
请考虑以下代码段,声明一个基类和两个扩展程序。
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'],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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。