serialization 包
介绍
用户定义的类型,可以通过实现 Serializable 接口,来支持序列化和反序列化。
主要接口
class DataModel
public abstract class DataModel
此类为中间数据层。
class DataModelNull
public class DataModelNull <: DataModel
此类为 DataModel 的子类,实现对 Null 类型数据的封装。
class DataModelBool
public class DataModelBool <: DataModel {
public init(bv: Bool)
}
此类为 DataModel 的子类,实现对 Bool 类型数据的封装。类的主要函数如下所示:
init
public init(bv: Bool)
功能:构造一个具有初始数据的 DataModelBool。
参数:
bv:传入的Bool类型
func getValue
public func getValue(): Bool
功能:获取 DataModelBool 中的数据。
返回值:DataModelBool 中类型为 Bool 的 value 数值
class DataModelInt
public class DataModelInt <: DataModel {
public init(iv: Int64)
}
此类为 DataModel 的子类,实现对 Int64 类型数据的封装。类的主要函数如下所示:
init
public init(iv: Int64)
功能:构造一个具有初始数据的 DataModelInt。
参数:
iv:传入的Int64类型
func getValue
public func getValue(): Int64
功能:获取 DataModelInt 中的数据。
返回值:DataModelInt 中类型为 Int64 的 value 数值
class DataModelFloat
public class DataModelFloat <: DataModel {
public init(fv: Float64)
public init(v: Int64)
}
此类为 DataModel 的子类,实现对 Float64 类型数据的封装。类的主要函数如下所示:
init
public init(fv: Float64)
功能:构造一个具有初始数据的 DataModelFloat。
参数:
fv:传入的Float64类型
init
public init(v: Int64)
功能:构造一个具有初始数据的 DataModelFloat。
参数:
v:传入的Int64类型
func getValue
public func getValue(): Float64
功能:获取 DataModelFloat 中的数据。
返回值:DataModelFloat 中类型为 Float64 的 value 数值
class DataModelString
public class DataModelString <: DataModel {
public init(sv: String)
}
此类为 DataModel 的子类,实现对 String 类型数据的封装。类的主要函数如下所示:
init
public init(sv: String)
功能:构造一个具有初始数据的 DataModelString。
参数:
sv:传入的String类型
func getValue
public func getValue(): String
功能:获取 DataModelString 中的数据。
返回值:DataModelString 中类型为 String 的 value 数值
class DataModelSeq
public class DataModelSeq <: DataModel {
public init()
public init(list: ArrayList<DataModel>)
}
此类为 DataModel 的子类,实现对 ArrayList<DataModel> 类型数据的封装。类的主要函数如下所示:
init
public init()
功能:构造一个空参的 DataModelSeqitems 默认为空的 ArrayList<DataModel>。
init
public init(list: ArrayList<DataModel>)
功能:构造一个具有初始数据的 DataModelString。
参数:
list:传入的ArrayList<DataModel>类型
func getItems
public func getItems(): ArrayList<DataModel>
功能:获取 DataModelSeq 中的数据。
返回值:类型为 ArrayList<DataModel> 的 items 数据
func add
public func add(dm: DataModel)
功能:在 DataModelSeq 末尾增加一个数据 dm。
参数:
- dm:传入的
DataModel类型
class DataModelStruct
public class DataModelStruct <: DataModel {
public init()
public init(list: ArrayList<Field>)
}
此类为 DataModel 的子类,用来实现 class 对象到 DataModel 的转换。
init
public init()
功能:构造一个空参的 DataModelStructfields 默认为空的 ArrayList<Field>。
init
public init(list: ArrayList<Field>)
功能:构造一个具有初始数据的 DataModelStruct。
参数:
list:传入的ArrayList<Field>类型
func getFields
public func getFields(): ArrayList<Field>
功能:获取 DataModelStruct 的数据集合。
返回值:类型为 ArrayList<Field> 的 fields 数据
func add
public func add(fie: Field): DataModelStruct
功能:添加数据 fie 到 DataModelStruct 中。
参数:
fie:传入的Field类型
返回值:得到新的 DataModelStruct
func get
public func get(key: String): DataModel
功能:获取 key 对应的数据。
参数:
key:传入的String类型
返回值:类型为 DataModel,如未查找到对应值,则返回 DataModelNull
class Field
public class Field {
public init(name: String, data: DataModel)
}
Field 类用于存储 DataModelStruct 的元素。
init
public init(name: String, data: DataModel)
功能:Field 的构造函数。
参数:
name:name字段值,name字段为""时行为与为其它字符串时一致data:data字段值
func getName
public func getName(): String
功能:获取 name 字段。
返回值:获取 name 字段,类型为 String
func getData
public func getData(): DataModel
功能:获取 data 字段。
返回值:获取 data 字段,类型为 DataModel
func field
public func field<T>(name: String, data: T) : Field where T <: Serializable<T>
功能:此函数用于将一组数据 name 和 data 封装到 Field 对象中。处理一组数据 name 和 data,将 data 序列化为 DataModel 类型,并将二者封装到 Field 对象中。
参数:
name:String类型,name字段为""时行为与为其它字符串时一致data:T类型,T类型必须实现Serializable<T>接口
返回值:封装了 name 和 data 的 Field 对象
class DataModelException
public class DataModelException <: Exception {
public init()
public init(message: String)
}
此类为 Exception 的子类,DataModel 的异常类。类的主要函数如下所示:
init
public init()
功能:创建 DataModelException。
init
public init(message: String)
功能:创建 DataModelException。
参数:
message:异常提示字符串
interface Serializable
public interface Serializable<T> {
func serialize(): DataModel
static func deserialize(dm: DataModel): T
}
此接口用于规范序列化。接口的主要函数如下所示:
func serialize
func serialize(): DataModel
功能:将自身序列化为 DataModel。
返回值:序列化 DataModel
func deserialize
static func deserialize(dm: DataModel): T
功能:将 DataModel 反序列化为对象。
返回值:反序列化的对象
哪些类型支持实现 Serializable :
- 基本数据类型:整数类型、浮点类型、布尔类型、字符类型、字符串类型;
Collection类型:Array、ArrayList、HashSet、HashMap、Option;- 用户自定义的实现了
Serializable<T>的类型。
extend Int64 <: Serializable
extend Int64 <: Serializable<Int64>
拓展 Int64 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Int64 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): Int64
功能:将 DataModel 反序列化为 Int64。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Int64
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend Int32 <: Serializable
extend Int32 <: Serializable<Int32>
拓展 Int32 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Int32 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): Int32
功能:将 DataModel 反序列化为 Int32。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Int32
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend Int16 <: Serializable
extend Int16 <: Serializable<Int16>
拓展 Int16 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Int16 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): Int16
功能:将 DataModel 反序列化为 Int16。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Int16
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend Int8 <: Serializable
extend Int8 <: Serializable<Int8>
拓展 Int8 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Int8 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): Int8
功能:将 DataModel 反序列化为 Int8。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Int8
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend UInt64 <: Serializable
extend UInt64 <: Serializable<UInt64>
拓展 UInt64 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 UInt64 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): UInt64
功能:将 DataModel 反序列化为 UInt64。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 UInt64
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend UInt32 <: Serializable
extend UInt32 <: Serializable<UInt32>
拓展 UInt32 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 UInt32 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): UInt32
功能:将 DataModel 反序列化为 UInt32。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 UInt32
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend UInt16 <: Serializable
extend UInt16 <: Serializable<UInt16>
拓展 UInt16 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 UInt16 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): UInt16
功能:将 DataModel 反序列化为 UInt16。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 UInt16
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend UInt8 <: Serializable
extend UInt8 <: Serializable<UInt8>
拓展 UInt8 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 UInt8 序列化为 DataModelInt。
返回值:序列化的 DataModelInt
func deserialize
static public func deserialize(dm: DataModel): UInt8
功能:将 DataModel 反序列化为 UInt8。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 UInt8
异常:
DataModelException:如果dm不是DataModelInt,则抛出异常
extend Float64 <: Serializable
extend Float64 <: Serializable<Float64>
拓展 Float64 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Float64 序列化为 DataModelFloat。
返回值:序列化的 DataModelFloat
func deserialize
static public func deserialize(dm: DataModel): Float64
功能:将 DataModel 反序列化为 Float64。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Float64
异常:
DataModelException:如果dm不是DataModelFloat,则抛出异常
extend Float32 <: Serializable
extend Float32 <: Serializable<Float32>
拓展 Float32 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Float32 序列化为 DataModelFloat。
返回值:序列化的 DataModelFloat
func deserialize
static public func deserialize(dm: DataModel): Float32
功能:将 DataModel 反序列化为 Float32。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Float32
异常:
DataModelException:如果dm不是DataModelFloat,则抛出异常
extend Float16 <: Serializable
extend Float16 <: Serializable<Float16>
拓展 Float16 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Float16 序列化为 DataModelFloat。
返回值:序列化的 DataModelFloat
func deserialize
static public func deserialize(dm: DataModel): Float16
功能:将 DataModel 反序列化为 Float16。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Float16
异常:
DataModelException:如果dm不是DataModelFloat,则抛出异常
extend Bool <: Serializable
extend Bool <: Serializable<Bool>
拓展 Bool 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Bool 序列化为 DataModelBool。
返回值:序列化的 DataModelBool
func deserialize
static public func deserialize(dm: DataModel): Bool
功能:将 DataModel 反序列化为 Bool。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Bool
异常:
DataModelException:如果dm不是DataModelBool,则抛出异常
extend String <: Serializable
extend String <: Serializable<String>
拓展 String 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 String 序列化为 DataModelString。
返回值:序列化的 DataModelString
func deserialize
static public func deserialize(dm: DataModel): String
功能:将 DataModel 反序列化为 String。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 String
异常:
DataModelException:如果dm不是DataModelString,则抛出异常
extend Char <: Serializable
extend Char <: Serializable<Char>
拓展 Char 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Char 序列化为 DataModelString。
返回值:序列化的 DataModelString
func deserialize
static public func deserialize(dm: DataModel): Char
功能:将 DataModel 反序列化为 Char。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Char
异常:
DataModelException:如果dm不是DataModelString,则抛出异常Exception:如果dm不是Char,则抛出异常
extend Option <: Serializable
extend Option<T> <: Serializable<Option<T>> where T <: Serializable<T>
拓展 Option<T> 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Option<T> 中的 T 序列化为 DataModel。
返回值:序列化的 DataModel
func deserialize
static public func deserialize(dm: DataModel): Option<T>
功能:将 DataModel 反序列化为 Option<T>。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Option<T>
extend Array <: Serializable
extend Array<T> <: Serializable<Array<T>> where T <: Serializable<T>
拓展 Array<T> 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 Array<T> 序列化为 DataModelSeq。
返回值:序列化的 DataModelSeq
func deserialize
static public func deserialize(dm: DataModel): Array<T>
功能:将 DataModel 反序列化为 Array<T>。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 Array<T>
异常:
DataModelException:如果dm不是DataModelSeq,则抛出异常
extend ArrayList <: Serializable
extend ArrayList<T> <: Serializable<ArrayList<T>> where T <: Serializable<T>
拓展 ArrayList<T> 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 ArrayList<T> 序列化为 DataModelSeq。
返回值:序列化的 DataModelSeq
func deserialize
static public func deserialize(dm: DataModel): ArrayList<T>
功能:将 DataModel 反序列化为 ArrayList<T>。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 ArrayList<T>
异常:
DataModelException:如果dm不是DataModelSeq,则抛出异常
extend HashSet <: Serializable
extend HashSet<T> <: Serializable<HashSet<T>> where T <: Serializable<T> & Hashable & Equatable<T>
拓展 HashSet<T> 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 HashSet<T> 序列化为 DataModelSeq。
返回值:序列化的 DataModelSeq
func deserialize
static public func deserialize(dm: DataModel): HashSet<T>
功能:将 DataModel 反序列化为 HashSet<T>。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 HashSet<T>
异常:
DataModelException:如果dm不是DataModelSeq,则抛出异常
extend HashMap <: Serializable
extend HashMap<K, V> <: Serializable<HashMap<K, V>> where K <: Serializable<K> & Hashable & Equatable<K>, V <: Serializable<V>
拓展 HashMap<K, V> 以实现 Serializable。
func serialize
public func serialize(): DataModel
功能:将 HashMap<K, V> 序列化为 DataModelSeq。
返回值:序列化的 DataModelSeq
异常:
DataModelException:如果当前HashMap实例中的Key不是String类型,则抛出异常
func deserialize
static public func deserialize(dm: DataModel): HashMap<K, V>
功能:将 DataModel 反序列化为 HashMap<K, V>。
参数:
dm:需要被反序列化的DataModel
返回值:反序列化后的 HashMap<K, V>
异常:
DataModelException:如果dm不是DataModelStruct类型或者DataModelStruct类型的dm中的Field不是String类型,则抛出异常
示例
class 序列化和反序列化
对 class Abc 进行序列化和反序列化。
代码如下:
from serialization import serialization.*
from std import math.*
from encoding import json.*
class Abc <: Serializable<Abc> {
var name: String = "Abcde"
var age: Int64 = 555
var loc: Option<Location> = Option<Location>.None
public func serialize(): DataModel {
return DataModelStruct().add(field<String>("name", name)).add(field<Int64>("age", age)).add(field<Option<Location>>("loc", loc))
}
public static func deserialize(dm: DataModel): Abc {
let dms = match (dm) {
case data: DataModelStruct => data
case _ => throw Exception("this data is not DataModelStruct")
}
let result = Abc()
result.name = String.deserialize(dms.get("name"))
result.age = Int64.deserialize(dms.get("age"))
result.loc = Option<Location>.deserialize(dms.get("loc"))
return result
}
}
class Location <: Serializable<Location> {
var time: Int64 = 666
var heheh: Char = 'T'
public func serialize(): DataModel {
return DataModelStruct().add(field<Int64>("time", time)).add(field<Char>("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 = Char.deserialize(dms.get("heheh"))
return result
}
}
main(): Unit {
let dd = Abc()
let aa: JsonValue = dd.serialize().toJson()
let bb: JsonObject = (aa as JsonObject).getOrThrow()
let v1 = (bb.get("name").getOrThrow() as JsonString).getOrThrow()
let v2 = (bb.get("age").getOrThrow() as JsonInt).getOrThrow()
let v3 = bb.get("loc").getOrThrow()
println(v1.getValue())
println(v2.getValue())
println(v3.toString())
println("===========")
let aaa = ##"{"age": 123, "loc": { "heheh": "H", "time": 45 }, "name": "zhangsan"}"##
let bbb = JsonValue.fromStr(aaa)
let ccc = (bbb as JsonObject).getOrThrow()
let v4 = (ccc.get("name").getOrThrow() as JsonString).getOrThrow()
let v5 = (ccc.get("age").getOrThrow() as JsonInt).getOrThrow()
let v6 = (ccc.get("loc").getOrThrow() as JsonObject).getOrThrow()
let v7 = (v6.get("time").getOrThrow() as JsonInt).getOrThrow()
let v8 = (v6.get("heheh").getOrThrow() as JsonString).getOrThrow()
println(v4.getValue())
println(v5.getValue())
println(v7.getValue())
println(v8.getValue())
}
运行结果如下:
Abcde
555
null
===========
zhangsan
123
45
H
HashSet 和 HashMap 序列化
对 HashSet 和 HashMap 进行序列化。
代码如下:
from std import collection.*
from serialization import serialization.*
from encoding import json.*
main(): Unit {
let s: HashSet<Values> = HashSet<Values>([Values(3), Values(5), Values(7)])
let seris: DataModel = s.serialize()
println(seris.toJson().toJsonString())
println("===========")
let m: HashMap<String, Values> = HashMap<String, Values>([("1", Values(3)), ("2", Values(6)), ("3", Values(9))])
let serim: DataModel = m.serialize()
print(serim.toJson().toJsonString())
}
class Values <: Hashable & Equatable<Values> & Serializable<Values> {
var m_data: Int64
init(m_data: Int64) {
this.m_data = m_data
}
public func hashCode(): Int64 {
return this.m_data
}
public operator func ==(right: Values): Bool {
let a = (this.m_data == right.m_data)
if (a) { return true } else { return false }
}
public operator func !=(right: Values): Bool {
let a = (this.m_data != right.m_data)
if (a) { return true } else { return false }
}
public func serialize(): DataModel {
return DataModelStruct().add(field<Int64>("m_data", m_data))
}
public static func deserialize(dm: DataModel): Values {
let dms: DataModelStruct = match (dm) {
case data: DataModelStruct => data
case _ => throw Exception("this data is not DataModelStruct")
}
let result = Values(0)
result.m_data = Int64.deserialize(dms.get("m_data"))
return result
}
}
运行结果如下:
[
{
"m_data": 3
},
{
"m_data": 5
},
{
"m_data": 7
}
]
===========
{
"1": {
"m_data": 3
},
"2": {
"m_data": 6
},
"3": {
"m_data": 9
}
}