kotlinx.serialization: ввести локальный параметр - PullRequest
1 голос
/ 30 марта 2020

Мне нужно внедрить локальное значение в конструктор класса во время десериализации . Например, посмотрите на следующий класс.

@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, к которому я пытаюсь получить доступ.

Существует ли стандартный способ ввода локальных параметров? Что не так с моим трюком?

...