kotlin 的官方序列化库,通过自动生成代码来避免反射。只需要在 kotlin 类上标记 @serializable
注解就可以,内置标准集合的序列化方法。 支持 JSON,CBOR, Protobuf格式
提供的注解
-
@Serializable
注解 用于标记kotlin的类,为类生成序列化serializer
方法。 -
@Optional
注解 用于标记属性参数,被标记的属性需要提供默认数据。可选参数,如果序列化数据中有就使用数据提供的,没用就使用默认的 -
@Serialname
注解 用于标记属性参数,重新定义序列化时的参数名 -
@Transient
注解 用于标记属性参数, 被标记的参数不参与序列化
JSON 参数
JSON 类的定义:
class JSON(
private val unquoted: Boolean = false,
private val indented: Boolean = false,
private val indent: String = " ",
internal val strictMode: Boolean = true,
val updateMode: UpdateMode = UpdateMode.OVERWRITE,
val encodeDefaults: Boolean = true
): ......
- unquoted 参数: 无引号模式,无符号模式下 序列化过程中key值和value值是没有引号包围的如:
"{a:1}"
[一般用于测试] - indented 是否缩进: 用于多行 JSON 输出模式
- indent 缩进字符: 换行缩进字符
- strictMode 参数: 严格模式下, JSON 转化过程不允许有类中没有规定的key值,类序列化过程不允许 NaN 和 无尽浮点数
- updateMode 参数: 更新模式[针对集合],
BANNED
禁止出现重复,OVERWRITE
覆盖数据,UPDATE
合并
内置对象 JSON.plain
, JSON.indented
, JSON.nonstrict
,JSON.unquoted
val plain = JSON()
val unquoted = JSON(unquoted = true)
val indented = JSON(indented = true)
val nonstrict = JSON(strictMode = false)
使用方式
import kotlinx.serialization.Optional
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.json.JSON
import kotlinx.serialization.list
import org.junit.Test
class SerializeTest {
@Serializable
data class Data(val a: Int, @Optional val b: String = "er", @Transient val c: Int = 5, @SerialName("d") val dd: Float = 7.1f)
@Test fun testSerialize(){
System.out.println(JSON.stringify(Data.serializer(), Data(42)))
System.out.println(JSON.indented.stringify(Data.serializer().list, listOf(Data(42))))
val obj = JSON.unquoted.parse(Data.serializer(), "{a:2, d: 3.4}")
System.out.print(obj)
/*
{"a":42,"b":"er","d":7.1} // 默认格式
[
{
"a": 42,
"b": "er",
"d": 7.1
}
]// 缩进格式
Data(a=2, b=er, c=5, dd=3.4)
*/
}
}