Flutter笔记序列化与反序列化
作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
本文地址:https://blog.csdn.net/qq_28550263/article/details/133340592
目 录
1. 概述
序列化是一种将复杂数据结构(例如对象、数组、字典等)转换为线性格式或字节流的过程,以便于数据的存储、传输和共享。通过序列化,数据被转换为一个持久化的、可传输的、平台无关的格式,这使得数据可以在不同的应用程序、编程语言和系统之间进行交互和互操作。序列化通常用于数据持久化(将应用程序状态保存到磁盘)、数据传输(在网络通信中传递数据)、数据存储(将对象存储到数据库或缓存中)、远程过程调用(在分布式系统中调用远程方法)以及消息传递(在消息队列或事件总线中传递消息)。不同的序列化格式(如JSON、XML、二进制序列化等)可以根据需求选择,以便实现数据的可读性、效率和兼容性。
在实际开发中,序列化(Serialization)的主要用途包括:
用途 | 描述 |
数据持久化 | 将应用程序的状态、配置或用户数据以序列化的方式保存到磁盘或其他存储介质上,以便在应用程序重新启动时重新加载。这对于保存用户首选项、游戏进度、应用程序状态等非常有用。 |
数据传输 | 在网络通信中,数据通常需要在客户端和服务器之间传递。序列化可以将复杂的数据结构(如对象、数组、字典等)转换为可传输的格式,例如 JSON 或 XML,以便于跨平台通信。这对于 Web 应用程序、移动应用程序和后端服务之间的数据交换非常重要。 |
跨平台兼容性 | 在多个编程语言和平台之间共享数据时,序列化使数据能够在不同环境中保持一致性。例如,您可以在一个使用 Python 编写的服务中将数据序列化为 JSON,然后在使用 JavaScript 编写的前端应用程序中反序列化这些数据。 |
远程过程调用(RPC) | 某些分布式系统使用序列化来调用远程服务器上的方法并传递参数。序列化允许在客户端和服务器之间传递数据和指令,以便执行远程操作。 |
数据存储和检索 | 在使用数据库或缓存存储数据时,将对象序列化为格式化的数据,然后存储起来,以便日后检索和使用。这种情况下,序列化通常用于将对象转换为关系型数据库中的表格行或将对象存储到 NoSQL 数据库中。 |
消息传递 | 在消息队列系统或事件总线中,序列化用于将消息或事件传递给不同的应用程序组件或服务。 |
序列化它允许数据在不同环境和应用程序之间流动和共享,从而实现了数据的持久性、跨平台互操作性和分布式通信。不同的编程语言和平台通常支持不同的序列化格式(如 JSON、XML、Protobuf、MessagePack 等),开发人员需要根据特定的需求和场景选择合适的序列化方法和格式。
2. JSON 序列化和反序列化
2.1 对象到 JSON 的序列化
要在 Dart 中进行 JSON 序列化和反序列化,首先需要导入 Dart 的 dart:convert
库,该库提供了用于处理 JSON 数据的工具。
要将 Dart 对象序列化为 JSON 格式,可以使用 json.encode()
函数:
import 'dart:convert'; Map<String, dynamic> user = { 'name': 'Jack', 'age': 28, }; String jsonUser = json.encode(user); print(jsonUser);
2.2 JSON 到对象的反序列化
要将 JSON 数据反序列化为 Dart 对象,可以使用 json.decode()
函数:
import 'dart:convert'; String jsonUser = '{"name": "Jack", "age": 28}'; Map<String, dynamic> user = json.decode(jsonUser); print(user['name']); // 输出 "Jack"
3. 自定义对象的序列化与反序列化
3.1 实现自定义序列化与反序列化方法
假设我们有一个自定义的 Dart 类表示用户信息,为了实现自定义对象的序列化和反序列化,我们可以在 User
类中添加 toJson()
和 fromJson()
方法:
import 'dart:convert'; class User { String name; int age; User(this.name, this.age); // 序列化为 JSON Map<String, dynamic> toJson() { return { 'name': name, 'age': age, }; } // 从 JSON 反序列化 User.fromJson(Map<String, dynamic> json) : name = json['name'], age = json['age']; }
3.2 使用自定义序列化与反序列化
现在,我们可以将自定义对象转换为 JSON 格式和从 JSON 反序列化为对象:
import 'dart:convert'; User user = User('Jack', 28); // 对象到 JSON String jsonUser = json.encode(user.toJson()); print(jsonUser); // JSON 到对象 Map<String, dynamic> userMap = json.decode(jsonUser); User newUser = User.fromJson(userMap); print(newUser.name); // 输出 "Jack"
通过实现 toJson()
和 fromJson()
方法,我们可以自定义对象的序列化和反序列化过程,以适应特定的数据结构和需求。
4. 嵌套对象的序列化与反序列化
如果对象包含嵌套对象,可以在 toJson()
和 fromJson()
方法中递归调用序列化和反序列化方法来处理嵌套对象。
import 'dart:convert'; class Address { String street; String city; Address(this.street, this.city); Map<String, dynamic> toJson() { return { 'street': street, 'city': city, }; } /// 从 JSON 格式的 Map 反序列化为 Address 对象 Address.fromJson(Map<String, dynamic> json) : street = json['street'], city = json['city']; } class User { String name; int age; Address address; User(this.name, this.age, this.address); /// 将 User 对象转换为 JSON 格式的 Map Map<String, dynamic> toJson() { return { 'name': name, 'age': age, 'address': address.toJson(), }; } /// 从 JSON 格式的 Map 反序列化为 User 对象 User.fromJson(Map<String, dynamic> json) : name = json['name'], age = json['age'], address = Address.fromJson(json['address']); }
接下来,我们演示如何使用 Address
和 User
类进行序列化和反序列化:
首先,让我们创建一个 Address
对象和一个 User
对象,并将它们转换为 JSON 格式:
void main() { // 创建一个 Address 对象 Address userAddress = Address('123 Main St', 'Cityville'); // 创建一个 User 对象,包括姓名、年龄和地址信息 User user = User('John Doe', 30, userAddress); // 将 User 对象转换为 JSON 格式 Map<String, dynamic> userJson = user.toJson(); print(userJson); }
上述代码中,我们首先创建了一个 Address
对象和一个 User
对象。然后,我们使用 toJson()
方法将 User
对象转换为 JSON 格式的 Map
对象,并将其打印输出。这将产生如下的 JSON 数据:
{ "name": "John Doe", "age": 30, "address": { "street": "123 Main St", "city": "Cityville" } }
接下来,我们将展示如何将上述 JSON 数据反序列化为 User
对象:
void main() { // JSON 格式的用户数据 Map<String, dynamic> jsonUserData = { "name": "Alice Smith", "age": 25, "address": { "street": "456 Elm St", "city": "Townsville" } }; // 从 JSON 格式的数据反序列化为 User 对象 User newUser = User.fromJson(jsonUserData); // 打印新创建的 User 对象的属性 print('Name: ${newUser.name}'); print('Age: ${newUser.age}'); print('Street: ${newUser.address.street}'); print('City: ${newUser.address.city}'); }
在上述代码中,我们首先定义了一个 JSON 格式的用户数据。然后,我们使用 User.fromJson()
方法将 JSON 数据反序列化为 User
对象,并输出了新创建的 User
对象的属性。
这两个示例演示了如何使用 Address
和 User
类进行对象的序列化和反序列化,以便于数据的存储和传输。序列化将对象转换为 JSON 数据,而反序列化则将 JSON 数据还原为对象,使得数据在不同的应用程序组件或系统之间能够进行有效的交互和共享。