数据序列化组件
数据序列化组件用于在对象和数据格式(如 JSON)之间进行转换。
提示:选择合适的序列化方案可以提高代码的类型安全性和可维护性。
📱 渲染效果预览
{
"name": "John",
"age": 25,
"email": "john@example.com"
}
json_serializable
json_serializable 提供类型安全的 JSON 序列化。
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User {
final String name;
final int age;
final String email;
User({required this.name, required this.age, required this.email});
factory User.fromJson(Map json) => _$UserFromJson(json);
Map toJson() => _$UserToJson(this);
}
// 使用
final userJson = '{"name":"John","age":25,"email":"john@example.com"}';
final user = User.fromJson(jsonDecode(userJson));
final json = jsonEncode(user.toJson());
📱 渲染效果预览
Dart Object
User(name: "John", age: 25)
⇄
JSON
{"name":"John","age":25}
dart:convert
dart:convert 是 Dart 内置的编码/解码库。
import 'dart:convert';
// 编码为 JSON
final data = {
'name': 'John',
'age': 25,
'email': 'john@example.com',
};
final jsonString = jsonEncode(data);
// 解码 JSON
final decoded = jsonDecode(jsonString);
print(decoded['name']); // John
// 处理列表
final users = [
{'name': 'John', 'age': 25},
{'name': 'Jane', 'age': 30},
];
final jsonString = jsonEncode(users);
final decoded = jsonDecode(jsonString) as List;
for (var user in decoded) {
print('${user['name']}: ${user['age']}');
}
📱 渲染效果预览
✓ 推荐
Freezed
- ✓ 不可变类
- ✓ 模式匹配
- ✓ 序列化支持
- ✓ 复制with方法
传统类
- ✗ 可变
- ✗ 无模式匹配
- ✗ 手动序列化
- ✗ 需手动实现
Freezed
Freezed 是一个用于生成不可变类的代码生成库。
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
part 'user.g.dart';
@freezed
class User with _$User {
const factory User({
required String name,
required int age,
String? email,
}) = _User;
factory User.fromJson(Map json) => _$UserFromJson(json);
}
// 使用
final user = User(name: 'John', age: 25);
final json = user.toJson();
final userFromJson = User.fromJson(json);
📱 渲染效果预览
User
Immutable Object
⇄
Serialized
Binary / JSON
built_value
built_value 提供不可变数据类和序列化支持。
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'user.g.dart';
abstract class User implements Built {
String get name;
int get age;
String? get email;
User._();
factory User([updates(UserBuilder b)]) = _$User;
static Serializer get serializer => _$userSerializer;
}
// 注册序列化器
final serializers = (Serializers().toBuilder()
..add(User.serializer));
// 序列化
final user = User((b) => b
..name = 'John'
..age = 25);
final json = serializers.serialize(user);
final userFromJson = serializers.deserialize(json) as User;
序列化方案选择:
- json_serializable: Flutter 官方推荐,类型安全
- dart:convert: 简单快速,适合小型项目
- Freezed: 提供不可变类和模式匹配
- built_value: 高性能,适合大型项目
注意事项:
- 运行代码生成命令(flutter pub run build_runner build)
- 将生成的文件添加到 .gitignore
- 确保在 pubspec.yaml 中添加必要的依赖