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
}
}