use*_*438 6 serialization dependency-injection kotlin kotlinx.serialization
我需要在反序列化期间将本地值注入到类构造函数中。例如,看看下面的课程。
@Serializable
class SomeClass(val local: Context, val serialized: String)
Run Code Online (Sandbox Code Playgroud)
local我希望在序列化期间跳过该字段,并在反序列化期间用一些预定义的本地值替换。
背后的原因是我将通过网络传输模型,但是这些模型的操作依赖于我想要注入的本地上下文。
因为我还没有找到任何标准方法来实现它,所以我决定使用上下文序列化。所以我写了序列化器:
class ContextualInjectorSerializer<T>(private val localValue: T) : KSerializer<T> {
override val descriptor = SerialDescriptor("ValueInjection", StructureKind.OBJECT)
override fun deserialize(decoder: Decoder): T {
decoder.beginStructure(descriptor).endStructure(descriptor)
return localValue
}
override fun serialize(encoder: Encoder, value: T) {
encoder.beginStructure(descriptor).endStructure(descriptor)
}
}
Run Code Online (Sandbox Code Playgroud)
并这样使用它:
// Context is marked with @Serializable(with = ContextSerializer::class)
val json = Json(JsonConfiguration.Stable, SerializersModule {
contextual(Context::class, ContextualInjectorSerializer(context))
})
// serialize/deserialize
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,它在 JVM 上运行得非常好。但是,当我将其编译为 JS 并进行测试时,我得到了TypeError: Cannot read property 'siteId' of undefined. 这siteId是我尝试访问的 Context 字段。
是否有注入本地参数的标准方法?我的伎俩有什么问题吗?
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |