如何将序列化程序设置为扩展 public 接口的内部 class?
How to set serializer to an internal class extending a public interface?
我正在尝试使用 kotlinx.serialization
为 Compose Desktop
class 创建一个序列化程序,我有这个 :
@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
class 的实例(如 @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)
没有办法自动 link 我的序列化程序到 MutableState
接口吗?由于 SnapshotMutableStateImpl
是内部的,我无法将其设置为此 class.
您想要的暂时无法实现。其他人似乎在 GitHub: Global Custom Serializers.
上请求了类似于您需要的功能
目前,3rd party classes, you need to specify the serializer 的三种方式之一:
- 将自定义序列化程序传递给 encode/decode 方法,以防您将其序列化为根对象。
- 像现在一样使用
@Serializable
在 属性 上指定序列化程序。
- 使用
@file:UseSerializers
指定完整文件要使用的序列化器。
请注意,由于类型推断,number
将尝试序列化为 mutableStateOf
的 return 类型。如果您将类型指定为接口(它有超类型吗?),使用多态序列化,您可以尝试注册具体类型并将您的自定义序列化器传递给具体类型。并不是这个功能的真正设计目的,但我相信如果您不想在多个地方指定序列化程序,它可能会起作用。然而,序列化的形式将在所有地方包含一个类型鉴别器。
我正在尝试使用 kotlinx.serialization
为 Compose Desktop
class 创建一个序列化程序,我有这个 :
@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
class 的实例(如 @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)
没有办法自动 link 我的序列化程序到 MutableState
接口吗?由于 SnapshotMutableStateImpl
是内部的,我无法将其设置为此 class.
您想要的暂时无法实现。其他人似乎在 GitHub: Global Custom Serializers.
上请求了类似于您需要的功能目前,3rd party classes, you need to specify the serializer 的三种方式之一:
- 将自定义序列化程序传递给 encode/decode 方法,以防您将其序列化为根对象。
- 像现在一样使用
@Serializable
在 属性 上指定序列化程序。 - 使用
@file:UseSerializers
指定完整文件要使用的序列化器。
请注意,由于类型推断,number
将尝试序列化为 mutableStateOf
的 return 类型。如果您将类型指定为接口(它有超类型吗?),使用多态序列化,您可以尝试注册具体类型并将您的自定义序列化器传递给具体类型。并不是这个功能的真正设计目的,但我相信如果您不想在多个地方指定序列化程序,它可能会起作用。然而,序列化的形式将在所有地方包含一个类型鉴别器。