序列化
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
}