Kotlin的数据类

引言

我们在做项目中涉及到各种数据类的处理,很多很杂乱。难免一个人的知识点有盲点,所以想着做个整理。

定义

在平时的使用中,我们会用到一些类来保持一些数据或状态,我们习惯上成为bean或者entity,也有的定义为model

kotlin中有专门处理这一种类的关键字:data。

Kotlin 复制代码
data class MyData(var name :String , var age : Int )

这种由data修饰的类叫做数据类,编译器自动从在主构造函数定义的全部特性中得到以下成员:

  • equals()/hashCode()
  • toString() 格式是 "MyData(name="wudi", age=20)"
  • componentN() 方法对应按声明顺序出现的所有属性
  • copy() 方法

特点:

  1. 类由关键字data修饰(好像是废话)
  2. 类的构造参数必须由var/val修饰,否则编译不通过
  3. 编译器会自动生成一些常用方法,你可以自定义它们
  4. 和普通类一样,如果你需要一个无参构造方法,可以将构造方法的参数都设置默认值

使用场景

默认值

如果我们构造函数需要默认值情况:

Kotlin 复制代码
data class HomeInfoList(
    val curPage: Int = 0,
    val offset: Int = 0,
    val pageCount: Int = 0,
    val size: Int = 0,
    val total: Int = 0,
    val over: Boolean = false,
    val datas: MutableList<HomeInfo>? = mutableListOf()
)

序列化、反序列化

一、概念

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

序列化 (Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。

在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

二、序列化的目的

以某种存储形式使自定义对象持久化。(对象随着程序的运行而被创建,然后在不可达时被回收,生命周期是短暂的。但是如果我们想长久地把对象的内容保存起来怎么办呢?把它转化为字节序列保存在存储介质上即可。那就需要序列化。)

将对象从一个地方传递到另一个地方(网络传输)。(所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method invoke,即远程方法调用),传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。)

进程间传递对象。(Android是基于Linux系统,不同进程之间的 java 对象是无法传输,所以我们此处要对对象进行序列化,从而实现对象在应用程序进程和ActivityManagerService进程之间传输。)

简单说:

其实序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。

而我们进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式就是字节数组

因为我们单方面的只把对象转成字节数组还不行,因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的,所以我们必须在把对象转成字节数组的时候就制定一种规则(序列化 ),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。

例如:如果我们要把一栋房子从一个地方运输到另一个地方去,序列化就是我把房子拆成一个个的砖块放到车子里,然后留下一张房子原来结构的图纸,反序列化就是我们把房子运输到了目的地以后,根据图纸把一块块砖头还原成房子原来面目的过程。

三、什么时候需要序列化?

凡是需要进行"跨平台存储"和"网络传输"的数据,都需要进行序列化。

本质上 存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。

相关推荐
LcGero21 小时前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
fundoit21 小时前
MySQL插入数据遇到唯一键已存在怎么办?
android·数据库·mysql
ZHANG13HAO21 小时前
Python 调用 Node.js(vm2 沙箱)完美方案:胶水层实战教程
开发语言·python·node.js
asdzx6721 小时前
使用 C# 将 Excel 转换成高质量 JPG
开发语言·c#·excel
瑶总迷弟21 小时前
Python入门第7章:用户输入和 while 、for循环
开发语言·python·microsoft
ameyume21 小时前
基于原生Android 16设置音量调用流程
android·audio
ii_best21 小时前
lua语言开发脚本基础、mql命令库开发、安卓/ios基础开发教程,按键精灵新手工具
android·ios·自动化·编辑器
Allen_LVyingbo21 小时前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(上)
开发语言·数据结构·架构·健康医疗·量子计算
无巧不成书021821 小时前
Java变量初始化全攻略:2026最新规范+新手避坑实战
java·开发语言·java基础·java变量初始化·java语法规范·var关键字
Highcharts.js21 小时前
企业级可视化生态系统|关于Highcharts集成的前端框架、后端编程语言与生态
开发语言·javascript·python·前端框架·编辑器·编程语言·highcharts