ID

sealed class ID : Comparable<ID> , Cloneable

唯一标识 ID.

一个 ID,其代表了两种数据:ID的类型,以及ID具体的值。

假若一个 ID 中实际存储的值仅有一个,则它的 toString 应当就是它的字面值。 通常情况下 ID 之间的相等判断即通过字面值进行。

ID可排序的

序列化

ID 应当支持序列化, 且 ID 的序列化器应当都是一个 primitive 序列化器。 所有的 ID 序列化后都不应是结构体, 而是一个原始类型值。

例如:

@Serializable
data class User(val id: LongID, val name: String)

val json = Json.encodeToString(User(213L.ID, "ForteScarlet"))
// json: {"id": 213, "name": "ForteScarlet"}

鉴于 ID 的最终序列化结果为原始类型,并且是非封闭性的, 因此在序列化是时使用 ID,需要使用一个具体的最终类型。

// 直接使用具体的ID类型,比如LongID
@Serializable
data class User(val id: LongID)

对于一个可序列化类型,作为属性的 ID 必须是一个具体的可字面量序列化类型,而不能是一个抽象类型。

如果对于一个ID字段,你希望能够保证它能够完全的正反序列化,并且你只关心它的字面量而不关系其他方面, 那么你可以考虑将此字段的序列化器标记为 ID.AsCharSequenceIDSerializer.

@Serializable
data class Example(
@Serializable(ID.AsCharSequenceIDSerializer::class)
val id: ID,
val name: String
)

此序列化其会永远将ID视为其字面值字符串作为序列化目标。

Author

ForteScarlet

See also

Types

Link copied to clipboard
object AsCharSequenceIDSerializer : KSerializer<ID>

将一个 ID 视为一个 CharSequenceID 进行序列化。

Link copied to clipboard
object Companion

Functions

Link copied to clipboard
abstract operator override fun compareTo(other: ID): Int

ID之间应当是可以排序的。

Link copied to clipboard
operator override fun equals(other: Any?): Boolean
Link copied to clipboard
abstract override fun hashCode(): Int
Link copied to clipboard
abstract override fun toString(): String

IDtoString 结果必须是当前ID所对应的字面值。

Inheritors

Link copied to clipboard
Link copied to clipboard

Extensions

Link copied to clipboard

ID的字面值。等同于 ID.toString.

Link copied to clipboard

所有的ID都拥有转化为字符序列ID的能力。

Link copied to clipboard

尝试将当前ID转化为一个 Long

Link copied to clipboard

尝试将当前ID转为一个 LongID.

Link copied to clipboard

尝试将当前ID转为一个 NumericalID