Skip to content

序列化

Spire序列化(Serialization)是一个基于宏的自动序列化解决方案,通过简单的注解即可为类生成序列化和反序列化功能。它采用编译时代码生成的方式,提供高性能的序列化体验。

快速启动

只需要以下 3 个步骤即可开始使用序列化框架:

cangjie
import stdx.encoding.json.*
import spire_serialization.*
import spire_serialization.macros.*

// 1. 使用@Serialization注解标记类
@Serialization
public class Student {
    // 2. 定义以_开头的字段
    private var _id: Int64 = 0
    private var _name: ?String = None
    private var _type: ?String = None
}

main() {
    // 3.创建对象并使用序列化功能
    let student = Student(id: 123, name: "cangjie")
    // 序列化为Json
    student.serialize().toJson() |> println
    // 反序列化
    let newStudent = Student.deserialize(DataModel.fromJson(student.serialize().toJson()))
    println("姓名: ${newStudent.name}")
}

我们可以查看宏展开代码来看序列化框架为我们完成了那些工作。

序列化规范

框架会字段生成属性和全字段的可选命名构造器。

  • 范式:
cangjie
private var _[identifier]:Type = expr
  • 反例:
cangjie
private var id: Int64 = 0 // 非下划线开头
private let _id: Int64 = 0 // 关键词不是var
private var _id = 0 // 缺失类型标注

属性覆盖

符合序列化规则的字段会自动生成属性。如果不需要setter或者属性的类型是字段类型的超类 属性和字段的类型可以不一致,可以忽略setter

cangjie
public class Order {
    private let _items: ArrayList<OrderItem> = ArrayList<OrderItem>()

    // 使用同名属性覆盖
    public prop items: ReadOnlyList<OrderItem> {
        get() {
            _items
        }
    }
}

字段映射

如果json字段使用的是下划线,但是不希望cangjie字段使用下划线。

cangjie
@Serialization
public class User {
    @DataField["user_name"]
    private var _userName: String = String.empty
}