Flutter笔记:序列化与反序列化

简介: 本文基于Dart/Flutter介绍使用序列化和反序列化

Flutter笔记序列化与反序列化


作者李俊才 (jcLee95)https://blog.csdn.net/qq_28550263

邮箱 :291148484@163.com

本文地址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']);
}

接下来,我们演示如何使用 AddressUser 类进行序列化和反序列化:

首先,让我们创建一个 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 对象的属性。

这两个示例演示了如何使用 AddressUser 类进行对象的序列化和反序列化,以便于数据的存储和传输。序列化将对象转换为 JSON 数据,而反序列化则将 JSON 数据还原为对象,使得数据在不同的应用程序组件或系统之间能够进行有效的交互和共享。

目录
相关文章
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
47 0
|
3月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
45 1
|
3月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
97 10
|
3月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
26 1
|
3月前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
3月前
|
XML Dubbo Java
分布式-序列化,反序列化
分布式-序列化,反序列化