Jon Bailey
06/20/2024, 5:21 PMbuildSerialDescriptor
but that is marked as internal and experimental.
The class is just like this:
public sealed class Union2<out T1T, out T2T> {
data class T1<T1T>(val value: T1T): Union2<T1T, Nothing>()
data class T2<T2T>(val value: T2T): Union2<Nothing, T2T>()
}
Ben Woodworth
06/20/2024, 6:15 PMephemient
06/20/2024, 11:18 PMclass Union2Serializer<T1, T2>(
private val t1Serializer: KSerializer<T1>,
private val t2Serializer: KSerializer<T2>,
) : KSerializer<Union2<T1, T2>> {
override val descriptor: SerialDescriptor = SerialDescriptor(
"Union2<${t1Serializer.descriptor.serialName}, ${t2Serializer.descriptor.serialName}>",
JsonElement.serializer().descriptor,
)
override fun serialize(encoder: Encoder, value: Union2<T1, T2>) = when (value) {
is Union2.T1 -> encoder.encodeSerializableValue(t1Serializer, value.value)
is Union2.T2 -> encoder.encodeSerializableValue(t2Serializer, value.value)
}
override fun deserialize(decoder: Decoder): Union2<T1, T2> {
val json = (decoder as JsonDecoder).decodeJsonElement()
return try {
Union2.T1(decoder.json.decodeFromJsonElement(t1Serializer, json))
} catch (_: SerializationException) {
Union2.T2(decoder.json.decodeFromJsonElement(t2Serializer, json))
}
}
}
I think wrapping JsonElement.serializer().descriptor
would be the most appropriate thing in that caseJon Bailey
06/24/2024, 11:49 AMephemient
06/24/2024, 12:46 PM