`Dart` 中序列化与持久化

1,690 阅读2分钟

前言

学习的过程总是愉悦的。今天来给大家分享 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

image.png

举个栗子🌰

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);