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
相关产品推荐
相关产品推荐

