如何在Flutter中用json_serializable检查对象编译/运行时可序列化?
解决json_serializable的编译时/无反射运行时序列化检查问题
1. 编译时检查实现方案
因为json_serializable基于注解而非继承,要实现编译时检查,我们可以通过自定义接口绑定序列化能力,结合Dart的泛型约束来实现编译期校验:
- 首先定义一个包含序列化方法签名的抽象接口:
abstract class JsonSerializableObject { Map<String, dynamic> toJson(); }
- 让所有使用
@JsonSerializable()注解的类显式实现这个接口(json_serializable会自动生成toJson()方法,无需手动编写方法体):
@JsonSerializable() class Person implements JsonSerializableObject { final String name; final int age; Person({required this.name, required this.age}); factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json); @override Map<String, dynamic> toJson() => _$PersonToJson(this); }
- 给泛型方法添加接口约束,这样编译时就会拦截不符合要求的参数:
// 仅允许传入实现了JsonSerializableObject的类型,编译不通过直接报错 void processSerializable<T extends JsonSerializableObject>(T object) { print('The object is serializable'); // 这里可以安全调用object.toJson(),不会出现编译错误 }
2. 无反射的运行时检查方案
如果需要在运行时动态判断对象是否可序列化,直接用Dart原生的is运算符即可,完全不需要反射:
bool isSerializable(Object object) { return object is JsonSerializableObject; }
调用示例:
void main() { var person = Person(name: 'John', age: 30); var nonSerializable = 'test string'; print(isSerializable(person)); // 输出true print(isSerializable(nonSerializable)); // 输出false }
补充说明
- 若需要同时检查反序列化能力(即类是否有
fromJson工厂方法),由于Dart接口无法强制静态方法,可额外给序列化类添加静态标记属性来辅助判断,但多数业务场景下,仅检查序列化(toJson)能力就足够。 - 该方案完全兼容json_serializable原有工作流程,只是给注解类增加了接口实现,没有侵入性。
内容的提问来源于stack exchange,提问作者pitazzo
相关产品推荐
相关产品推荐

