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 中类型为 Boolvalue 数值

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 中类型为 Int64value 数值

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 中类型为 Float64value 数值

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 中类型为 Stringvalue 数值

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

功能:添加数据 fieDataModelStruct 中。

参数:

  • 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 的构造函数。

参数:

  • namename 字段值,name 字段为 "" 时行为与为其它字符串时一致
  • datadata 字段值

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>

功能:此函数用于将一组数据 namedata 封装到 Field 对象中。处理一组数据 namedata,将 data 序列化为 DataModel 类型,并将二者封装到 Field 对象中。

参数:

  • nameString 类型,name 字段为 "" 时行为与为其它字符串时一致
  • dataT 类型,T 类型必须实现 Serializable<T> 接口

返回值:封装了 namedataField 对象

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 类型:ArrayArrayListHashSetHashMapOption
  • 用户自定义的实现了 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
  }
}