【问题标题】:How to set serializer to an internal class extending a public interface?如何将序列化程序设置为扩展公共接口的内部类?
【发布时间】:2022-01-22 09:56:12
【问题描述】:

我正在尝试使用kotlinx.serializationCompose Desktop 类创建一个序列化程序,我有这个:

@Serializer(forClass = MutableState::class)
class MutableStateSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<MutableState<T>> {
    override fun deserialize(decoder: Decoder) = mutableStateOf(decoder.decodeSerializableValue(dataSerializer))
    override val descriptor: SerialDescriptor = dataSerializer.descriptor
    override fun serialize(encoder: Encoder, value: MutableState<T>) = encoder.encodeSerializableValue(dataSerializer, value.value)
}

这应该用于MutableState 类的实例(正如@Serializer 注释所说),但我必须为每个属性放置一个显式序列化器,否则我会收到此错误:

xception in thread "main" kotlinx.serialization.SerializationException: Class 'SnapshotMutableStateImpl' is not registered for polymorphic serialization in the scope of 'MutableState'.
Mark the base class as 'sealed' or register the serializer explicitly

使用的代码:

@Serializable
class Test {
    var number = mutableStateOf(0)
}

fun main() {
   val json = Json { prettyPrint = true }
   val serialized = json.encodeToString(Test())
   println(serialized)
}

我必须把这个注释放在我的财产上:

@Serializable(with = MutableStateSerializer::class)

有没有办法自动将我的序列化程序链接到MutableState 接口?由于SnapshotMutableStateImpl 是内部的,我无法将其设置为此类。

【问题讨论】:

    标签: kotlin serialization kotlinx.serialization compose-desktop


    【解决方案1】:

    目前无法实现您想要的。其他人似乎在 GitHub 上请求了与您需要的功能类似的功能:Global Custom Serializers

    目前,3rd party classes, you need to specify the serializer 采用以下三种方式之一:

    • 将自定义序列化程序传递给编码/解码方法,以防您将其序列化为根对象。
    • 使用@Serializable 指定属性的序列化程序,就像现在一样。
    • 使用@file:UseSerializers指定完整文件要使用的序列化程序。

    请注意,由于类型推断,number 将被尝试序列化为mutableStateOf 的返回类型。如果您将类型指定为接口(它是否具有超类型?),使用多态序列化,您可以尝试注册具体类型并将自定义序列化程序传递给具体类型。并不是这个功能的真正目的,但我相信如果你不想在多个地方指定你的序列化器,它可能会起作用。但是,序列化的表单会在任何地方都包含类型鉴别器。

    【讨论】:

    • 如果我使用@file:UserSerializers 注释,我是否必须将所有我需要的序列化程序?像StringNumber 等?还是我只需要为我的自定义序列化程序执行此操作?
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多