美文网首页
`Dart` 中序列化与持久化使用小结

`Dart` 中序列化与持久化使用小结

作者: 李小轰 | 来源:发表于2021-11-25 17:43 被阅读0次

前言

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

相关文章

  • `Dart` 中序列化与持久化使用小结

    前言 学习的过程总是愉悦的。今天来给大家分享 dart 开发中,序列化 与 持久化。 Dart 对象转 Map 在...

  • Flutter(三十三):JSON 的序列化和反序列化

    1 Flutter JSON 序列化反序列化 1、使用 dart:convert 手动序列化 JSON2、模型类中...

  • RDD持久化策略

    RDD持久化是可以手动选择不同的策略的。比如可以将RDD持久化在内存中、持久化到磁盘上、使用序列化的方式持久化,多...

  • Flutter - JSON与序列化

    两种JSON序列化方式: 手动序列化:适用小项目 代码生成自动序列化:适用大中型项目 手动序列化 使用 dart:...

  • Hadoop权威指南-ch4 Hadoop的I/O(3) 序列化

    注:本文涉及书中4.3小结 序列化与反序列化 1. 定义 序列化(serialization):将结构化对象转化为...

  • java序列化与反序列化

    java序列化与反序列化 对象序列化是一种持久化技术,广泛运用于网络传输、RMI等场景中。java对象存在于JVM...

  • java 序列化和反序列化

    使用Java的序列化和反序列化可以实现信息的持久存储要实现序列化必须实现java.io.Serializable这...

  • java day 19

    持久化和序列化 持久化持久化就是瞬间状态机制转换为持久状态。持久化的主要应用是将内存中的对象存储在数据库中,或者存...

  • 二叉树的序列化与反序列化

    1. 前言:为何要做序列化? 树这种数据结构存在内存中,序列化能够解决机器断电时在持久化存储介质中存储树的结构与数...

  • PHP反序列化漏洞知识整理

    0x00 序列化与反序列化序列化:将对象转化为字符串的形式,称为序列化,在php中可以使用serialize函数实...

网友评论

      本文标题:`Dart` 中序列化与持久化使用小结

      本文链接:https://www.haomeiwen.com/subject/mchztrtx.html