前言
学习的过程总是愉悦的。今天来给大家分享 dart 开发中,序列化
与 持久化
。
Dart 对象转 Map
在说序列化之前,我们先了解一下 Dart 对象与 Map 数据结构之间的相互转换
。
示例很简单,toMap
方法将对象转 Map , fromMap
方法将 Map 转对象。
class Teacher {
final String name;
final List<Student> students;
Teacher({
required this.name,
required this.students,
});
/// 注意,students 是数组,需进行遍历操作
Map<String, dynamic> toMap() {
return <String, dynamic>{
"name": name,
"students": students.map((e) => e.toMap()).toList(),
};
}
factory Teacher.fromMap(Map map) {
return Teacher(
name: map["name"],
students:
(map["students"] as List).map((e) => Student.fromMap(e)).toList(),
);
}
}
class Student {
final String name;
Student({required this.name});
Map<String, dynamic> toMap() {
return <String, dynamic>{
"name": name,
};
}
factory Student.fromMap(Map map) {
return Student(
name: map["name"],
);
}
}
关键点:当成员变量是数组对象时,需进行
map遍历
中转
序列化 & 反序列化
首先我们明确一下概念,序列化指的是 Dart 对象与 JSON 数据之间的相互转换
。在真实开发中,我们常常是这样做的: 将Dart对象
中转Map对象
, 然后将Map对象
转JSON
。
举个栗子🌰
import 'dart:convert' as json;
Student s1 = Student(name: "三儿");
Student s2 = Student(name: "小二");
Teacher teacher = Teacher(name: "班主任", students: [
s1,
s2,
]);
///dart 对象转 map
Map map = teacher.toMap();
///序列化 JSON 字符串
String jsonString = json.jsonEncode(map);
///反序列化
Map<String, dynamic> result = json.jsonDecode(jsonString);
///JSON 转 对象
Teacher teacher = Teacher.fromMap(result);
有同学说直接把
teacher.toMap().toString()
不就转换成字符串了吗,为什么还要多此一举用jsonEncode
来进行中转?
好吧,我们把 teacher.toMap().toString()
进行打印,结果如下:
{name: Finin, students: [{name: 张三}, {name: 李四}]}
再把 json.jsonEncode(map)
进行打印:
{"name":"Finin","students":[{"name":"张三"},{"name":"李四"}]}
两者比较可以看出, toString()
拿到的结果是map结构字符串,json.jsonEncode(map)
拿到的结果是JSON字符串。
持久化
我们常常将对象转字符串保存在sharepreference
中进行持久化操作。
在 pubspec.yaml
中引入支持包
shared_preferences: 2.0.9
创建 SharepreferenceTool
作为工具类
abstract class SharePreferenceTool {
static late SharedPreferences _sp;
static bool _inited = false;
static SharedPreferences get sp => _sp;
static bool get inited => _inited;
static Future<bool> init() async {
_sp = await SharedPreferences.getInstance();
_inited = true;
return true;
}
}
如何使用?来个栗子🌰
Map map = teacher.toMap();
String jsonString = json.jsonEncode(map);
if(!SharePreferenceTool.inited){
await SharePreferenceTool.init();
}
///将 jsonString 保存 sp
SharePreferenceTool.sp.setString("teacherSp", jsonString);
///通过 key 从 sp 获取 jsonString
String json = SharePreferenceTool.sp.getString("teacherSp")!;
/// jsonString 转 map
Map<String, dynamic> result = json.jsonDecode(json);