You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter整洁架构继承场景下JsonSerializable使用冲突如何解决

解决方案

报错的本质是json_serializable生成代码时遇到未配置序列化规则的未知类型(领域层的Server/Host类未加序列化注解),无法自动生成序列化逻辑。给领域层实体加注解等于把数据层的序列化依赖侵入了领域层,确实违反分层隔离原则,可通过以下两种方案解决:

方案1:优先采用「组合+独立Model+映射转换」(最符合整洁架构分层要求)

  • 领域层的Host、Server实体保持纯业务属性定义,不引入任何数据层依赖、序列化相关注解
  • 数据层的HostModel、ServerModel作为独立的DTO类存在,不继承领域层实体,所有字段和序列化规则都在数据层定义,直接给Model类加@JsonSerializable注解,嵌套字段直接声明为对应Model类型(比如HostModel的servers字段声明为List<ServerModel>),可正常生成序列化代码,完全不涉及领域层类
  • 在数据层实现双向转换逻辑:给Model类扩展toDomain()方法返回对应领域实体,增加fromDomain()命名构造方法接收领域实体生成Model实例,所有类型转换逻辑收敛在数据层内部
  • 后续如果要替换序列化方案(比如换成XML、ProtoBuf),仅需要修改数据层的DTO定义和转换逻辑,领域层不需要做任何改动,完全符合分层隔离要求

方案2:如果必须保留继承写法,使用自定义类型转换器

  • 不需要修改领域层实体的任何代码,在数据层的Model类对应字段上通过@JsonKey注解指定自定义序列化/反序列化方法
  • 示例代码如下:
@JsonSerializable()
class HostModel extends Host {
  @JsonKey(
    fromJson: _serverListFromJson,
    toJson: _serverListToJson,
  )
  final List<ServerModel> servers;

  HostModel({required String name, required this.servers}) : super(name: name, servers: servers);

  // 自定义反序列化逻辑,将json数组转换为ServerModel列表
  static List<ServerModel> _serverListFromJson(List<dynamic> json) {
    return json.map((item) => ServerModel.fromJson(item as Map<String, dynamic>)).toList();
  }

  // 自定义序列化逻辑,将ServerModel列表转换为可序列化的Map数组
  static List<Map<String, dynamic>> _serverListToJson(List<ServerModel> servers) {
    return servers.map((item) => item.toJson()).toList();
  }

  factory HostModel.fromJson(Map<String, dynamic> json) => _$HostModelFromJson(json);
  Map<String, dynamic> toJson() => _$HostModelToJson(this);
}
  • 这种方式所有序列化逻辑都收敛在数据层,不会侵入领域层,缺点是嵌套类型较多时需要编写多组转换方法。

内容的提问来源于stack exchange,提问作者Mackovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:06:08