Delegate json serialization strategy to BotConfiguration

This commit is contained in:
Him188 2020-06-17 14:19:59 +08:00
parent b2c53922f2
commit 4cb5d654b2
4 changed files with 19 additions and 21 deletions

View File

@ -19,9 +19,6 @@ import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.async
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.withContext
import kotlinx.serialization.UnstableDefault
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.json.int
import net.mamoe.mirai.Bot
import net.mamoe.mirai.LowLevelAPI
@ -241,10 +238,7 @@ internal abstract class QQAndroidBotBase constructor(
override val id: Long
get() = account.id
companion object {
@OptIn(UnstableDefault::class)
val json = Json(JsonConfiguration(ignoreUnknownKeys = true, encodeDefaults = true))
}
private inline val json get() = configuration.json
override val friends: ContactList<Friend> = ContactList(LockFreeLinkedList())

View File

@ -12,6 +12,9 @@ package net.mamoe.mirai.utils
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.serialization.UnstableDefault
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import net.mamoe.mirai.Bot
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
@ -118,6 +121,16 @@ internal open class BotConfigurationBase internal constructor() {
@MiraiExperimentalAPI
var fileCacheStrategy: FileCacheStrategy = FileCacheStrategy.PlatformDefault
/**
* Json 序列化器, 使用 'kotlinx.serialization'
*/
@SinceMirai("1.1.0")
@MiraiExperimentalAPI
var json: Json = kotlin.runCatching {
@OptIn(UnstableDefault::class)
Json(JsonConfiguration(isLenient = true, ignoreUnknownKeys = true))
}.getOrElse { Json(JsonConfiguration.Stable) }
enum class MiraiProtocol(
/** 协议模块使用的 ID */
@JvmField internal val id: Long

View File

@ -154,9 +154,9 @@ actual abstract class LoginSolver {
//////////////// internal
///////////////////////////////
internal fun getFileBasedDeviceInfoSupplier(filename: String): ((Context) -> DeviceInfo)? {
internal fun BotConfiguration.getFileBasedDeviceInfoSupplier(filename: String): ((Context) -> DeviceInfo)? {
return {
File(filename).loadAsDeviceInfo(it)
File(filename).loadAsDeviceInfo(json, it)
}
}

View File

@ -23,26 +23,17 @@ import kotlin.random.nextInt
/**
* 加载一个设备信息. 若文件不存在或为空则随机并创建一个设备信息保存.
*/
fun File.loadAsDeviceInfo(context: Context = ContextImpl()): DeviceInfo {
fun File.loadAsDeviceInfo(json: Json, context: Context = ContextImpl()): DeviceInfo {
if (!this.exists() || this.length() == 0L) {
return SystemDeviceInfo(context).also {
this.writeText(JSON.stringify(SystemDeviceInfo.serializer(), it))
this.writeText(json.stringify(SystemDeviceInfo.serializer(), it))
}
}
return JSON.parse(DeviceInfoData.serializer(), this.readText()).also {
return json.parse(DeviceInfoData.serializer(), this.readText()).also {
it.context = context
}
}
@OptIn(UnstableDefault::class)
private val JSON = Json(
JsonConfiguration(
ignoreUnknownKeys = true,
isLenient = true,
prettyPrint = true
)
)
@Serializable
actual open class SystemDeviceInfo actual constructor() : DeviceInfo() {
actual constructor(context: Context) : this() {