如何序列化包含抽象集合 class 的 class?

How to serialize a class containing a collection of an abstract class?

让我们看一下由三个 class 组成的简单 class 层次结构:

  1. 抽象基础class:

    abstract class BaseClass {
      String name;
    
      BaseClass(this.name);
    }
    
  2. 从抽象基础 class.

    派生的一些 classes
    @JsonSerializable()
    class ConcreteClass extends BaseClass {
      int someValue;
    
      ConcreteClass(this.someValue, String name) : super(name);
    
      factory ConcreteClass.fromJson(Map<String, dynamic> json) => _$ConcretClassFromJson(json);
    
      Map<String, dynamic> toJson() => _$ConcreteClassToJson(this);
    }
    
  3. 最后是一个主要的 class,它将所有具体的 class 存储在一个集合中。这是一个示例:

    @JsonSerializable()
    class DataJuggler {
      Set<BaseClass> allTheDataInTheWorld = Set<BaseClass>();
    
      DataJuggler();
    
      factory DataJuggler.fromJson(Map<String, dynamic> json) => _$DataJugglerFromJson(json);
    
      Map<String, dynamic> toJson() => _$DataJugglerToJson(this);
    }
    

启动 build_runner 生成 json 序列化代码时,失败并显示:

[SEVERE] json_serializable:json_serializable on lib/what_an_awesome_app/data_juggler.dart:

Could not generate `fromJson` code for `allTheDataInTheWorld` because of type `BaseClass`.
package:/totally_awesome/what_an_awesome_app/data_juggler.dart:12:25
   ╷
12 │   Set<BaseClass> allTheDataInTheWorld = Set<BaseClass>();
   ╵

现在的问题是,这里出了什么问题?或者更好:如何获得为 DataJuggler class 生成的 json 序列化代码?非常欢迎您的建议。谢谢。

您需要手动写下一些样板代码:https://github.com/google/json_serializable.dart/issues/145, https://github.com/google/json_serializable.dart/issues/371, and Extend with fromJson in dart

请注意,您的 BaseClass 当前缺少 fromJson,因此 DataJuggler 肯定无法生成 fromJson