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

这篇具有很好参考价值的文章主要介绍了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 数据还原为对象,使得数据在不同的应用程序组件或系统之间能够进行有效的交互和共享。文章来源地址https://www.toymoban.com/news/detail-730776.html

到了这里,关于Flutter笔记:序列化与反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】序列化与反序列化

    通过打包的方式,将结构体message发送给对方 对方收到后就会报告给上层QQ客户端 结构化的数据 是由 多个 string 构成的 而以前在网络套接字 发送时,都是按照一个字符串的方式来发送和接收的 所以想办法 ,把多个字符串 转化为 一个大\\\"字符串\\\",对方在接收时也是一个长的

    2024年02月10日
    浏览(44)
  • Springboot Jackson 序列化与反序列化配置

    可解决在使用默认反序列化Jackson时,LocalDateTime类型的请求参数反序列化失败的问题

    2024年02月02日
    浏览(43)
  • Leetcode 297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化

    2024年02月07日
    浏览(40)
  • 【Java 基础篇】Java序列化与反序列化详解

    在Java中,序列化和反序列化是一种将对象转换为字节流和将字节流转换为对象的机制。通过序列化,可以将对象存储到文件中、传输到网络上,或者在分布式系统中进行对象的传递。本文将详细介绍Java序列化和反序列化的原理、使用方法和常见应用场景,并提供一些示例代

    2024年02月09日
    浏览(36)
  • 深入探究序列化与反序列化:原理、应用和最佳实践

    序列化 (Serialization)是指将对象转化为字节流的过程,以便于存储或通过网络进行传输。 反序列化 (Deserialization)则是将字节流转化为对象的过程,恢复原始对象的状态。 在计算机科学中,序列化和反序列化是常用的数据处理技术,用于在不同系统、不同编程语言之间传

    2024年02月08日
    浏览(43)
  • Java安全基础之Java序列化与反序列化

    目录 ObjectInputStream 和 ObjectOutputStream java.io.Serializable 自定义序列化和反序列化 Java 的序列化(Serialization)是指将对象转换为字节序列的过程,而反序列化(Deserialization)则是将字节序列转换回对象的过程。 序列化和反序列化通常用于在网络上传输对象或者将对象持久化到文

    2024年04月22日
    浏览(39)
  • 【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(56)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(40)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包