【问题标题】:How to serialize a class containing a collection of an abstract class?如何序列化包含抽象类集合的类?
【发布时间】:2021-12-08 16:21:19
【问题描述】:

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

  1. 一个抽象基类:

    abstract class BaseClass {
      String name;
    
      BaseClass(this.name);
    }
    
  2. 一些派生自抽象基类的类。

    @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. 最后是一个主类,它将所有具体类存储在一个集合中。这是一个示例:

    @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 类生成的json 序列化代码?非常欢迎您的建议。谢谢。

【问题讨论】:

    标签: flutter serialization json-serialization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多