Мне нужно внедрить локальное значение в конструктор класса во время десериализации . Например, посмотрите на следующий класс.
@Serializable
class SomeClass(val local: Context, val serialized: String)
Я хочу, чтобы поле 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)
}
}
И использовал его так:
// Context is marked with @Serializable(with = ContextSerializer::class)
val json = Json(JsonConfiguration.Stable, SerializersModule {
contextual(Context::class, ContextualInjectorSerializer(context))
})
// serialize/deserialize
Удивительно, но на JVM он работает довольно хорошо. Однако, когда я скомпилировал его в JS и протестировал, я получил TypeError: Cannot read property 'siteId' of undefined
. Здесь siteId
- это поле Context, к которому я пытаюсь получить доступ.
Существует ли стандартный способ ввода локальных параметров? Что не так с моим трюком?