仓颉应用开发之——序列化基本概念(15)

一 概述

  • 序列化和反序列化概念
  • 仓颉编程实现序列化步骤
  • 仓颉编程中的函数及接口

二 序列化和反序列化概念

  • Java中提供了Serializable和Parcelable序列化接口
  • 序列化(Serialization)是一种将对象以一连串的字节描述的过程,将程序中的对象,放入硬盘(文件)中保存就是序列化,如果不存放在磁盘中,而是一直存放在内存中,会增大内存的消耗;序列化就是将对象的状态信息转换为可以存储或传输的形式的过程;
  • 反序列化(Deserialization)是一种将这些字节重建成一个对象的过程,将硬盘(文件)中的字节码重新转成对象就是反序列化。

三 仓颉编程实现序列化步骤

3.1 序列化步骤

  1. 自定义类实现Serializable接口,并实现serialize序列化方法、deserialize反序列化方法
  2. serialize序列化方法:调用DataModelStruct将类对象转换位DataModel
  3. deserialize反序列化方法:接受一个DataModel,并将DataModel对象解析为类对象

3.2 序列化示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Location <: Serializable<Location> {
var time: Int64 = 666
var heheh: Rune = 'T'

/* 实现 Serializable 接口的序列化方法 */
public func serialize(): DataModel {
return DataModelStruct().add(field<Int64>("time", time)).add(field<Rune>("heheh", heheh))
}

/* 实现反序列化方法 */
public static func deserialize(dm: DataModel): Location {
let dms = match (dm) {
case data: DataModelStruct => data
case _ => throw Exception("this data is not DataModelStruct")
}
let result = Location()
result.time = Int64.deserialize(dms.get("time"))
result.heheh = Rune.deserialize(dms.get("heheh"))
return result
}
}

四 仓颉编程中的函数及接口

4.1 导包

1
import serialization.serialization.*

4.2 继承关系( <:)和接口(Serializable)

1
2
3
4
class Location <: Serializable<Location>{
func serialize(): DataModel
static func deserialize(dm: DataModel): T
}

4.3 类

1-DataModel(抽象类,中间数据层)

1
public abstract class DataModel

2-具体类

具体类 方法 说明
DataModelBool getValue() Bool 类型数据的封装
DataModelFloat getValue() Float64 类型数据的封装
DataModelInt getValue() Int64 类型数据的封装
DataModelNull / 对 Null 类型数据的封装
DataModelSeq add(DataModel)
getItems()
对 ArrayList<DataModel> 类型数据的封装
DataModelString getValue() 对 String 类型数据的封装
DataModelStruct add(Field)
get(String)
getFields()
实现 class 对象到 DataModel 的转换
Field getData()
getName()
存储 DataModelStruct 的元素

五 参考

  • CSDN-序列化、反序列化
  • HarmonyOS NEXT Developer Beta5 仓颉-serialization模块